Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 444
pirate Avatar asked Oct 04 '14 19:10

pirate


People also ask

What is long float in C?

The long float is a K&R C first edition type that existed. It is synonymous with double . After the first standard C89/C90, long float is removed.


2 Answers

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.

like image 159
T.C. Avatar answered Oct 02 '22 23:10

T.C.


long long d = 999999998.9999999994; 

The closest value to 999999998.9999999994 that double can represent is 999999999.0 - remember that floating points have finite precision ;).
Therefore, truncating the decimal places yields 999999999, and thats what is saved in d.

Using a literal with L-suffix does indeed lead to 999999998 being saved in d - long double has a higher precision.

long long d = 999999998.9999994994;

The closest value to 999999998.9999994994 that double can represent is actually below 999999999 - approximately 999999998.999999523 on my machine. Truncating the decimal places subsequently yields 999999998, and that is stored in d.

like image 44
Columbo Avatar answered Oct 02 '22 23:10

Columbo