views:

269

answers:

3

I am converting four bytes to float and I'm getting NaN as a result, but I want the value 0.0. What am I doing wrong?

This is my code:

public class abc 
{
    public static void main(String[] args) 
    {
        int[] arry = { 255, 255, 255, 255 };
        int num = ((arry[0] << 24) & 0xFF000000) | ((arry[1] << 16) & 0xFF0000)
   | ((arry[2] << 8) & 0xFF00) | (arry[3] & 0xFF);
        float f = Float.intBitsToFloat(num);

        f= (float) ((f < 0 ? Math.ceil(f * 10) : Math.floor(f * 10)) / 10);

        System.out.println(f);
    }
}
+3  A: 

Well, your bit pattern happens to actually be NaN:

IEEE 754 NaNs are represented with the exponential field filled with ones and some non-zero number in the significand. A bit-wise example of a IEEE floating-point standard single precision NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx where x means don't care. If a = 1, it is a quiet NaN, otherwise it is a signalling NaN.

Since all your bits are 1, it obviously fits above criteria and is a quiet NaN (although Java iirc doesn't even support quiet or signalling NaNs).

Joey
+6  A: 

Your main problem is that 0xFFFFFFFF is indeed a NaN.

A float with a value of 0 is... 0.

Changing the array to

int[] arry = { 0x00, 0x00, 0x00, 0x00 };

Will change the resulting value to a 0.0f float.

LiraNuna
A: 

NaN = Not a Number, iaw, the bit pattern 0xFFFFFFFF does not represent a float value number. (Joachim, you're right .. again :-) )

Andreas_D
then what to do to get correct value
sanjana
`NaN` is a float value, otherwise you couldn't store it in a `float` variable. It's just not a number ;-)
Joachim Sauer
Which value do you expect, what is 'correct'? if you want '0.0f', then use {0,0,0,0} int array. If you want the corresponding float for 0xffffffff, then just cast (`float f = (float) num`)
Andreas_D