DorelBarbu's blog

By DorelBarbu, history, 8 years ago, In English

Hello, everybody! I was solving http://codeforces.net/contest/319/problem/C which uses the "Convex Hull Trick". After many failed attempts I peeked at the AC solutions.I found a very interesting thing. This gets AC. However, if I replace the explicit conversion to double, with an explicit conversion to long long (which seems more suitable in this case, since we're not dealing with floating point numbers) I get WA, like this. Now, forgive me if it is a dumb question but I really didn't come across something like this before. Can someody help me figure it out? Thank you!

  • Vote: I like it
  • -6
  • Vote: I do not like it

»
8 years ago, # |
  Vote: I like it +6 Vote: I do not like it

cout << (double)1000000000*1000000000 << " " << 1000000000*1000000000 << endl;

Try this and you will understand.

  • »
    »
    8 years ago, # ^ |
    Rev. 2   Vote: I like it +1 Vote: I do not like it

    I believe it's more like

    cout << (double)1000000000*1000000000 << " " << (long long)1000000000*1000000000 << endl;

    Because in the code he's referenced, the instruction was cast to long long on its both sides

    • »
      »
      »
      8 years ago, # ^ |
      Rev. 2   Vote: I like it +6 Vote: I do not like it

      I hope, now it will be better for you.

      long long x = (long long)1e+18;
      cout << (double)x*x << " " << (long long)x*x << endl;
      
      • »
        »
        »
        »
        8 years ago, # ^ |
          Vote: I like it +5 Vote: I do not like it

        This is indeed much more clearer. Learning by example is great. But what is the exact reason for this? Can a double hold bigger integers than long long?

      • »
        »
        »
        »
        8 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Oh thank you!

        That was useful. :D