Подписать проверку на значение NaN - PullRequest
2 голосов
/ 09 января 2012

Моя программа во время расчета может генерировать значения nan или -nan. Я проверяю, являются ли значения nan / -nan, используя метод isnan.

Я также должен различать, является ли значение nan положительным или отрицательным (nan или -nan). Как я могу это сделать?

Добавлено: мне нужно кроссплатформенное решение для WIN и для Unix / Linux

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Попробуйте signbit из <math.h>:

Описание

signbit () - это универсальный макрос, который может работать со всеми действительными числами с плавающей запятойтипы.Он возвращает ненулевое значение, если для значения x установлен бит знака.

...

NaN и бесконечности имеют бит знака.

Это, очевидно, часть C99 и POSIX.1-2001, но вы можете написать макрос / функцию самостоятельно, если не хотите использовать / соответствовать одному из двух.

2 голосов
/ 09 января 2012

Почти все системы сегодня используют IEEE с одинарной или двойной точностью с плавающей запятой.Таким образом, в этом случае вы можете (поразрядно) преобразовать его в целое число и прочитать бит знака.

Вот один из подходов, который использует объединения.Хотя он не полностью соответствует стандартам, он все равно должен работать практически на всех системах.

union{
    double f;
    uint64_t i;
} x;

x.f = ... //  Your floating-point value (can be NaN)

//  Check the sign bit.
if ((x.i & 0x8000000000000000ull) == 0){
    //  positive
}else{
    //  negative
}
1 голос
/ 09 января 2012

Вы можете использовать функцию copysign (C99, в <math.h>);

double sign = copysign(1.0, your_nan);

Из C99 §7.12.11.1:

Описание

Функции copysign выдают значение с величиной x и знаком y. Они производят NaN (со знаком y), если x является NaN. На реализации, которые представляет ноль со знаком, но не обрабатывает отрицательный ноль последовательно в арифметике операции, функции copysign рассматривают знак нуля как положительный.

Возвращает

Функции copysign возвращают значение с величиной x и знаком y.

...