Тестирование, если значение 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
.
Пожалуйста, дайте мне знать, нужно ли выполнять настройку компилятора. Я бегу по соляриусу. Или есть другой способ проверить то же самое.
Спасибо заранее.
Ответы
Ответ 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