Проверка, является ли double (или float) NaN в C++

В текущей стандартной библиотеке double C++ нет функции isnan(). Он был cxx введен в C99 и определен как nan macro, а не функция. Элементы nan стандартной библиотеки, определенные c++ C99, не являются частью текущего c++ стандарта C++ ISO / IEC 14882: 1998 c++ и его обновления ISO / IEC nan 14882: 2003.

В 2005 году был cxx предложен Технический отчет cpp 1. TR1 обеспечивает совместимость cpp с C99 с C++. Несмотря на cxx то, что он никогда не был cpp официально принят в качестве double стандарта C++, многие (GCC 4.0+ или cpp Visual C++ 9.0+ реализации C++ действительно cpp предоставляют функции TR1, все c++ они или только некоторые cxx (Visual C++ 9.0 не предоставляет cxx математические функции C99).

Если cxx TR1 доступен, то cmath включает cxx элементы C99, такие как isnan(), isfinite() и cxx т. д., но они определены cpp как функции, а не макросы, обычно double в пространстве имен std::tr1::, хотя double многие реализации (например, GCC cxx 4 + в Linux или в XCode в cpp Mac OS X 10.5+) вставляйте cpp их непосредственно в std::, поэтому c++ std::isnan четко определен.

Более того, некоторые double реализации C++ по-прежнему cpp делают макрос C99 isnan() доступным cxx для C++ (включенный через cxx cmath или math.h), что может вызвать cxx большую путаницу, и разработчики c++ могут предположить, что это cxx стандартное поведение.

Замечание nan о Viusal C++, как упоминалось double выше, он не предоставляет double ни std::isnan, ни std::tr1::isnan, но предоставляет cpp функцию расширения, определенную cpp как _isnan(), которая была доступна nan с Visual C++ 6.0

С XCode еще веселее. Как c++ уже упоминалось, GCC 4+ определяет cpp std::isnan. Для более старых версий cxx компилятора и библиотеки double XCode, похоже (здесь relevant discussion), не double было возможности проверить cxx себя) определены две функции: __inline_isnand() на cpp Intel и __isnand() на Power PC.

c++

double

nan

2022-11-10T05:05:16+00:00