Подтвердить что ты не робот

Тестирование, если значение Float - NaN

Возможный дубликат:
Проверка наличия двойного (или плавающего) nan в С++

У меня есть требование проверить, является ли float nan. Перейдя по некоторым ссылкам, я нашел наиболее распространенную проверку.

FLOAT32 f32_test_NaN = (some_value);
if (f32_test_NaN == f32_test_NaN)
{
    //do something;
}
else
{
    // do something;
}

Но это, похоже, не работает для меня. Мой код выглядит следующим образом:

FLOAT32 test_NaN = 0x414570A3;//some value - is this ok?

Отладка в GDB:

(gdb) p test_NaN
$1 = 1.09506982e+09

(gdb) p/x test_NaN
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing?

Итак, в моем случае test_NaN равно test_NaN.

Пожалуйста, дайте мне знать, нужно ли выполнять настройку компилятора. Я бегу по соляриусу. Или есть другой способ проверить то же самое.

Спасибо заранее.

4b9b3361

Ответ 1

Проблема может быть в вашей инициализации (по крайней мере, это объясняет значение, которое вы видите в gdb):

FLOAT32 test_NaN = 0x414570A3;

Указанное шестнадцатеричное значение считается целочисленным и преобразуется в float (с показателем и значением), что означает, что он хранится в другом формате.

Если вы хотите заставить биты внутри поплавка, то вам нужно memcpy:

FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);

Ответ 2

Включите math.h и используйте int isnan(x). Не забудьте связать с -lm

Ответ 3

Если <math.h> недоступно, сделайте следующее:

if (x != x)
{
    // x is NaN
}

Ответ 4

if (x!= x)

Для x = 0x7FBFFFFF (знаковый бит 0, a = 0, остаток бит 1)

http://en.wikipedia.org/wiki/NaN

Побитовый пример стандартной одиночной точности (32-разрядной) IEEE с плавающей точкой NaN: s111 1111 1axx xxxx xxxx xxxx xxxx xxxx, где s - знак, x - полезная нагрузка, a - тип NaN, Если a = 1, это тихое NaN; если a равно нулю, а полезная нагрузка отлична от нуля, то это сигнализация NaN