Блог пользователя xuanquang1999

Автор xuanquang1999, история, 7 лет назад, По-английски

I'm solving 27E — Number With The Given Amount Of Divisors. My code involved a function mul(a, b) that will return 1018 + 7 if multiplying a and b will lead to overflow, and min(1018 + 7, a * b) otherwise. I checked for overflow using the condition a*b div a != b.

When I submit my solution using C++14, it seemed that the overflow check failed, which lead to WA on test 5.

34068376

However, when I uncomment the if statement in the mul function (which, theoretically don't print anything out), it get accepted.

34068431

I resubmitted the WA code with C++11 and C++17 Diagnostics, and it get accepted too.

I don't know what happened here. I suspected that some kind of optimization from compiler caused this strange behavior, but unfoturnately I know nothing about compiler optimization. Can anyone give me a proper explanation about this strange behavior? Thanks in advance.

  • Проголосовать: нравится
  • +14
  • Проголосовать: не нравится

»
7 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

You can check for overflows something like: a > inf / b. I think it's a better practice and it involves only one division instead of a multiplication and a division (so should be faster)

»
7 лет назад, # |
  Проголосовать: нравится +72 Проголосовать: не нравится

Signed overflow is undefined behavior, read here about that.

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится +24 Проголосовать: не нравится

    I've never thought that overflow is undefined behavior, thanks for informing me this.

    Also, I glad that this happened when I'm practicing, not in an actual contest.

»
7 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится

Actually you can use -fsanitize=undefined to check for overflow as it will indicate you which line does the overflow happen. (Warning: About 2 to 3 times slower compile time, only recommend when you are trying to debug). Moreover, fsanitize also highlight any errors you might have in your code (such as out-of-index access or any undefined behaviors like that ...). Hope it helps!