В какой части спецификации 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 ++ будет следовать тем же правилам