This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.

We need to convert Float to Binary and we are using the following APIs: 1) Float.floatToIntBits(<float> 2) Integer.toBinaryString(<intbits>

The usage is: String <string> = Integer.toBinaryString(Float.floatToIntBits(<float>

For most cases we get the correct Binary String. However, when the float variable has value = 8 digit integers, we run into the following problem:

Problem: floatToIntBits Returns the SAME output for different Input values.

Example:

public class TestFloatToBinary { //Function to convert the float value to binary public static void main(String args[]) { float f1 = 17012219; float f2 = 17012220; float f3 = 17012221; float f4 = 17012222;

System.out.println("float to intbits for f1 = " + Float.floatToIntBits(f1)); System.out.println("float to intbits for f2 = " + Float.floatToIntBits(f2)); System.out.println("float to intbits for f3 = " + Float.floatToIntBits(f3)); System.out.println("float to intbits for f4 = " + Float.floatToIntBits(f4));

System.out.println("Binary for f1 = " + sBinary1); System.out.println("Binary for f2 = " + sBinary2); System.out.println("Binary for f3 = " + sBinary3); System.out.println("Binary for f4 = " + sBinary4); } }

C:\work\krishna\java>java TestFloatToBinary float to intbits for f1 = 1266797310 float to intbits for f2 = 1266797310 float to intbits for f3 = 1266797310 float to intbits for f4 = 1266797311 Binary for f1 = 1001011100000011100101011111110 Binary for f2 = 1001011100000011100101011111110 Binary for f3 = 1001011100000011100101011111110 Binary for f4 = 1001011100000011100101011111111

As seen above, floatToIntBits and hence Integer.toBinaryString return the SAME value for Inputs 17012219, 17012220, 17012221.

You need to understand that floating point data types such as float and double do not have infinite precision.

You cannot store any number with an arbitrary number of digits and expect that it is stored with infinite precision.

The precision of a 32-bit IEEE 754 floating point number such as float in Java is about 5 or 6 decimal digits, so it's no surprise that numbers that differ beyond about the 5th digit only look the same in binary form.

Another thing that may be important to take into account is that all NaN results will produce the same result using Double.doubleToLongBits(). In this case, to diferentiate a NaN from another you might consider using Double.doubleToRawLongBits()