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
.
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.
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.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With