Namespaces
Variants

std::numeric_limits<T>::signaling_NaN

Начиная с ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (основные типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
 
 
 
static T signaling_NaN() throw();
(до C++11)
static constexpr T signaling_NaN() noexcept;
(начиная с C++11)

Возвращает специальное значение «сигнализирующее не-число» (signaling NaN), представленное типом с плавающей запятой T. Имеет смысл только если std::numeric_limits<T>::has_signaling_NaN == true. В IEEE 754, наиболее распространённом двоичном представлении чисел с плавающей запятой, любое значение, у которого все биты порядка установлены и установлен хотя бы один бит мантиссы, представляет NaN. Какие значения мантиссы представляют тихие или сигнализирующие NaN и имеет ли знаковый бит значение, определяется реализацией.

Возвращаемое значение

T std:: numeric_limits < T > :: signaling_NaN ( )
/* неспециализированный */ T ( )
bool false
char ​ 0 ​
signed char ​ 0 ​
unsigned char ​ 0 ​
wchar_t ​ 0 ​
char8_t (начиная с C++20) ​ 0 ​
char16_t (начиная с C++11) ​ 0 ​
char32_t (начиная с C++11) ​ 0 ​
short ​ 0 ​
unsigned short ​ 0 ​
int ​ 0 ​
unsigned int ​ 0 ​
long ​ 0 ​
unsigned long ​ 0 ​
long long (начиная с C++11) ​ 0 ​
unsigned long long (начиная с C++11) ​ 0 ​
float определяется реализацией (может быть FLT_SNAN )
double определяется реализацией (может быть DBL_SNAN )
long double определяется реализацией (может быть LDBL_SNAN )

Примечания

NaN никогда не сравнивается равным самому себе. Копирование NaN не требует, согласно IEEE-754, сохранения его битового представления (знак и полезная нагрузка ), хотя большинство реализаций это делают.

Когда сигнальная NaN используется в качестве аргумента арифметического выражения, может быть возбуждено соответствующее исключение с плавающей точкой, и NaN "заглушается", то есть выражение возвращает тихую NaN.

Пример

Демонстрирует использование сигнального NaN для вызова исключения с плавающей точкой:

#include <cfenv>
#include <iostream>
#include <limits>
#pragma STDC_FENV_ACCESS on
void show_fe_exceptions()
{
    int n = std::fetestexcept(FE_ALL_EXCEPT);
    if (n & FE_INVALID)
        std::cout << "FE_INVALID is raised\n";
    else if (n == 0)
        std::cout << "no exceptions are raised\n";
    std::feclearexcept(FE_ALL_EXCEPT);
}
int main()
{
    double snan = std::numeric_limits<double>::signaling_NaN();
    std::cout << "After sNaN was obtained, ";
    show_fe_exceptions();
    double qnan = snan * 2.0;
    std::cout << "After sNaN was multiplied by 2, ";
    show_fe_exceptions();
    double qnan2 = qnan * 2.0;
    std::cout << "After the quieted NaN was multiplied by 2, ";
    show_fe_exceptions();
    std::cout << "The result is " << qnan2 << '\n';
}

Вывод:

After sNaN was obtained, no exceptions are raised
After sNaN was multiplied by 2, FE_INVALID is raised
After the quieted NaN was multiplied by 2, no exceptions are raised
The result is nan

Смотрите также

идентифицирует типы с плавающей запятой, которые могут представлять специальное значение "сигнальное не-число" (NaN)
(публичная статическая константа-член)
[static]
возвращает тихое значение NaN для заданного типа с плавающей запятой
(публичная статическая функция-член)
(C++11)
проверяет, является ли заданное число NaN
(функция)