This week's book giveaway is in the Other Languages forum.We're giving away four copies of Functional Reactive Programming and have Stephen Blackheath and Anthony Jones on-line!See this thread for details.
Win a copy of Functional Reactive Programming this week in the Other Languages forum!

# Float & Double Conversion

Serdar Ozturk
Greenhorn
Posts: 14
The following code prints:
true
false
9.223372036854776E18 9.223372036854776E18
2.147483647E9 2.147483648E9
System.out.println( (double) Long.MAX_VALUE == (float) Long.MAX_VALUE ); // 1
System.out.println( (double) Integer.MAX_VALUE == (float) Integer.MAX_VALUE); // 2

System.out.println( (double) Long.MAX_VALUE +" " + (double)(float) Long.MAX_VALUE );
System.out.println( (double) Integer.MAX_VALUE +" "+ (double)(float) Integer.MAX_VALUE);

What's happening on line 2?
SerdaR

Shishio San
Ranch Hand
Posts: 223
Hi,
It has to do with the precision double and float types use to store the same number.
Remember double type uses 64 bits and float type uses 32 bits

Serdar Ozturk
Greenhorn
Posts: 14
well, long is 64-bit wide and there is no loss of precision when you convert it to float first and then to double... on line 1
On line 2, we convert 32-bit integer to float and then to double and we loss some precision.
Why dont we loss any precision on 64-bit long variable but on 32-bit integer?
Serdar

Shishio San
Ranch Hand
Posts: 223
Hi,

Widening primitive conversions do not lose information about the overall magnitude of a numeric value. Indeed, conversions widening from an integral type to another integral type and from float to double do not lose any information at all; the numeric value is preserved exactly. Conversion of an int or a long value to float, or of a long value to double, may result in loss of precision-that is, the result may lose some of the least significant bits of the value. In this case, the resulting floating-point value will be a correctly rounded version of the integer value,

Why dont we loss any precision on 64-bit long variable but on 32-bit integer?

Because Long.MAX_VALUE is much bigger than Integer.MAX_VALUE and both double and float won't have any difference in the precision used to represent it. As for Interger.MAX_VALUE, converting to double will preserve more signaficant number than converting it to float and this is again due to the number of bits of each type
Hope this is clearer

smita raval
Greenhorn
Posts: 28
But,

is not displaying the same value, then why it displays true while comparing ?

Shishio San
Ranch Hand
Posts: 223
Originally posted by smita raval:
But,

is not displaying the same value, then why it displays true while comparing ?

That's true but the difference btw the two numbers is small enough to be considered as 0.0