Search code examples
c++floating-pointdoublefloating-point-conversion

C++ double to long long


If i write code in c++:

long long d = 999999998.9999999994;
cout<<d;

I get output: 999999999 (rounding up)

But output of this code:

long long d = 999999998.9999994994;
cout<<d;

is 999999998 (rounding down)

Is it something to do with precision. Is there any way i can change precision. floor() function also gives the same output.

I also noticed that if i assign value 8.9999994994 or 8.9999999994 to d(above variable). Output is 8.


Solution

  • 999999998.9999999994 is not exactly representable in double, so the actual value is one of the two representable numbers on either side of 999999998.9999999994 - either 999999998.99999988079071044921875 or 999999999 (assuming IEEE-754 binary64 format), selected in an implementation-defined manner. Most systems will by default round to nearest, producing 999999999.

    The net result is that on those systems when you write 999999998.9999999994 it ends up having the exact same effect as writing 999999999.0. Hence the subsequent conversion yields 999999999 - the conversion from a floating point number to an integer always truncates, but here there is nothing to truncate.

    With 999999998.9999994994, the closest representable numbers are 999999998.999999523162841796875 and 999999998.99999940395355224609375. Either one produces 999999998 after truncation. Similarly, with 8.9999999994, the closest representable numbers are 8.999999999399999950355777400545775890350341796875 and 8.9999999994000017267126168007962405681610107421875, and either one will produce 8 after truncation.