2009-11-27 5 views
1

Je convertis quatre octets pour flotter et je reçois en résultat NaN, mais je veux la valeur 0.0. Qu'est-ce que je fais mal?NaN problème en Java

Ceci est mon 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); 
    } 
} 
+0

Quel est le contexte de cette question? – starblue

Répondre

3

Eh bien, votre modèle binaire se trouve en fait être NaN:

IEEE 754 NaN sont représentés avec le champ exponentielle rempli de celles et certains non nombre zéro dans le significand. Un exemple bit-sage d'unstandard simple précision NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx où x signifie don't care. Si a = 1, c'est un NaN tranquille, sinon c'est un NaN de signalisation.

Depuis tous vos bits sont 1, il convient évidemment des critères ci-dessus et est un NaN silencieux (bien que Java IIRC ne supporte même pas NaN calme ou de signalisation).

6

Votre problème principal est que 0xFFFFFFFF est en effet un NaN.

Un flotteur avec une valeur de 0 est ... 0.

Modification du tableau à

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

va changer la valeur résultante à un flotteur 0.0f.

0

NaN = Non un nombre, en effet, le motif de bits 0xFFFFFFFF ne représente pas un valeur flottante nombre. (Joachim, tu as raison ... encore :-))

+0

alors que faire pour obtenir la valeur correcte – sanjana

+1

'NaN' est une valeur flottante, sinon vous ne pourriez pas le stocker dans une variable' float'. Ce n'est juste pas un nombre ;-) –

+0

Quelle valeur attendez-vous, qu'est-ce qui est 'correct'? si vous voulez '0.0f', alors utilisez {0,0,0,0} int array. Si vous voulez le float correspondant pour 0xffffffff, alors cast juste ('float f = (float) num') –