2009-11-27 6 views
1

Я преобразовываю четыре байта в float, и в результате получаю NaN, но мне нужно значение 0.0. Что я делаю не так?Проблема NaN в Java

Это мой код:

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

В чем заключен этот вопрос? – starblue

ответ

3

Ну да, немного картины происходит на самом деле быть NaN:

IEEE 754 NaNs представлены с экспоненциальным поля заполнены единицами и некоторые не- нулевое число в значении. Поразрядный пример стандартной одиночной точности IEEE floating-point NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx, где x означает don't care. Если a = 1, это тихое NaN, иначе это сигнализация NaN.

С все ваши биты 1, то, очевидно, соответствует указанным выше критериям и является тихо NaN (хотя Java IIRC даже не поддерживает тихий или сигнализации пренебрежимо малых).

6

Ваша основная проблема заключается в том, что 0xFFFFFFFF действительно является NaN.

Поплавка со значением 0 ... 0.

Изменением массива

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

изменит полученное значение к 0.0f поплавку.

0

NaN = не номер, iaw, битовая диаграмма 0xFFFFFFFF не представляет значение с поплавком номер. (Йоахим, ты прав .. снова :-))

+0

то, что нужно сделать, чтобы получить правильное значение – sanjana

+1

'NaN' - это значение поплавка, иначе вы не смогли бы его сохранить в переменной' float'. Это просто не число ;-) –

+0

Какое значение вы ожидаете, что такое «правильно»? если вы хотите «0.0f», используйте массив {0,0,0,0} int. Если вы хотите, чтобы соответствующий float для 0xffffffff, тогда просто нажмите ('float f = (float) num') –

 Смежные вопросы

  • Нет связанных вопросов^_^