std::isnan
Определено в заголовке <cmath> | ||
|---|---|---|
| (1) | ||
bool isnan( float num ); bool isnan( double num ); bool isnan( long double num ); |
(с C++11) (до C++23) | |
constexpr bool isnan( /* floating-point-type */ num ); | (с C++23) | |
| Дополнительные перегрузки | ||
Определено в заголовке <cmath> | ||
template< class Integer > bool isnan( Integer num ); | (A) | (с C++11) (constexpr с C++23) |
num значением «не число» (NaN). Библиотека предоставляет перегрузки для всех типов чисел с плавающей точкой без квалификаторов cv как типа параметра num.(с C++23)
double.Параметры
| num | - | число с плавающей точкой или целое значение |
Возвращаемое значение
true , если num является NaN, false в противном случае.
Примечания
Существует множество различных значений NaN с различными битами знака и полезной нагрузкой, см. std::nan и std::numeric_limits::quiet_NaN.
Значения NaN никогда не сравниваются как равные самим себе или другим значениям NaN. Копирование NaN не требуется, согласно IEEE-754, для сохранения его битовой структуры (знак и полезная нагрузка), хотя большинство реализаций это делают.
Другой способ проверить, является ли значение с плавающей точкой NaN, это сравнить его с самим собой: bool is_nan(double x) { return x != x; }.
GCC и Clang поддерживают -ffinite-math опцию (дополнительно подразумеваемую -ffast-math), что позволяет соответствующему компилятору предполагать отсутствие специальных значений чисел с плавающей точкой IEEE-754, таких как NaN, бесконечность или отрицательный ноль. Другими словами, std::isnan предполагается, что всегда возвращает false при использовании этой опции.
Дополнительные перегрузки не обязаны быть реализованы точно так, как (A). Они должны быть достаточными для того, чтобы для их аргумента num целочисленного типа, std::isnan(num) имел тот же эффект, что и std::isnan(static_cast<double>(num)).
Пример
#include <cfloat>
#include <cmath>
#include <iostream>
int main()
{
std::cout << std::boolalpha
<< "isnan(NaN) = " << std::isnan(NAN) << '\n'
<< "isnan(Inf) = " << std::isnan(INFINITY) << '\n'
<< "isnan(0.0) = " << std::isnan(0.0) << '\n'
<< "isnan(DBL_MIN/2.0) = " << std::isnan(DBL_MIN / 2.0) << '\n'
<< "isnan(0.0 / 0.0) = " << std::isnan(0.0 / 0.0) << '\n'
<< "isnan(Inf - Inf) = " << std::isnan(INFINITY - INFINITY) << '\n';
}Вывод:
isnan(NaN) = true isnan(Inf) = false isnan(0.0) = false isnan(DBL_MIN/2.0) = false isnan(0.0 / 0.0) = true isnan(Inf - Inf) = true
См. также
|
(C++11)(C++11)(C++11) | значение «не число» (NaN) (функция) |
|
(C++11) | категоризует данное значение с плавающей точкой (функция) |
|
(C++11) | проверяет, имеет ли данное число конечное значение (функция) |
|
(C++11) | проверяет, является ли данное число бесконечным (функция) |
|
(C++11) | проверяет, является ли данное число нормальным (функция) |
|
(C++11) | проверяет, являются ли два значения с плавающей точкой неупорядоченными (функция) |
Документация на C для isnan |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/math/isnan