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
См. также
|
[статический] | определяет типы с плавающей точкой, которые могут представлять специальное значение «сигнализирующая не число» (NaN) (публичная статическая константа) |
|
[статический] | возвращает значение тихого NaN заданного типа с плавающей точкой (публичная статическая функция-член) |
|
(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