Namespaces
Variants

std::numeric_limits<T>:: signaling_NaN

From cppreference.net
Utilities library
static T signaling_NaN ( ) throw ( ) ;
(до C++11)
static constexpr T signaling_NaN ( ) noexcept ;
(начиная с C++11)

Возвращает специальное значение "сигнальный не-число ", представленное типом с плавающей точкой 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
(функция)