NaN проблема в Java - PullRequest
       31

NaN проблема в Java

1 голос
/ 27 ноября 2009

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

Это мой код:

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 ]

6 голосов
/ 27 ноября 2009

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

Число с плавающей запятой со значением 0 равно ... 0.

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

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

Изменит результирующее значение на 0.0f с плавающей точкой.

3 голосов
/ 27 ноября 2009

Ну, ваш битовый паттерн происходит на самом деле be NaN:

IEEE 754 NaN представлены с экспоненциальным полем, заполненным единицами, и некоторым ненулевым числом в значении. Побитовый пример IEEE с плавающей точкой стандартной одинарной точности NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx, где x означает все равно . Если a = 1, это тихий NaN, в противном случае это сигнальный NaN.

Поскольку все ваши биты равны 1, он явно соответствует вышеуказанным критериям и является тихим NaN (хотя Java iirc даже не поддерживает тихие или сигнальные NaN).

0 голосов
/ 27 ноября 2009

NaN = не число, т. Е. Битовая комбинация 0xFFFFFFFF не представляет собой число с плавающей запятой число. (Иоахим, ты прав .. опять :-))

...