Spec-Zone.ru › C++

std::numeric_limits<T>::signaling_NaN

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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/signaling_NaN

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API