Преобразование NaN в Bool: True или False?

В какой части спецификации C ++ или спецификации IEEE float указано, что значение NaN должно преобразовываться в true как в отличие от false?

Если я посмотрю на стандартный раздел C ++ 4.12 Логические преобразования , он говорит:

Нулевое значение, значение нулевого указателя или значение указателя нулевого члена равно преобразован в ложь; любое другое значение преобразуется в истину.

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

value == 0 ? false : true
value != 0 ? true : false

А что насчет преобразования в целое число. В приведенной ниже короткой программе показано, что переменная NAN, преобразованная в целое число, дает минимальное целое число, тогда как константа преобразуется в 0 (с использованием GCC).Это кажется странным.

#include <iostream>
#include <cmath>

void write( double r, int i, bool b )
{
    std::cout << r << " == " <<  i << " == " << (b ? "True" : "False") << std::endl;
}

int main()
{
    double value = NAN;
    write( value, value, value );
    write( NAN, NAN, NAN );
}

Результат:

nan == -2147483648 == True
nan == 0 == True

Преобразование NaN в ноль, но преобразование bool в True кажется проблемой. Я также не думаю, что что-то вроде MatLab преобразует NaN в 0 с помощью функции вроде int16 .

Итак, каковы особенности соответствующих стандартов, которые определяют, как NaN преобразуется в логические и целочисленные значения?

Я также помечаю C, поскольку, хотя он может не определять логическое преобразование, он, вероятно, определяет интеграл преобразование и использование в условном выражении, и я подозреваю, что C ++ будет следовать тем же правилам

17
задан edA-qa mort-ora-y 6 February 2012 в 10:15
поделиться