std::numeric_limits<T>::signaling_NaN
From cppreference.com
static T signaling_NaN() throw(); |
(C++11まで) | |
| static constexpr T signaling_NaN() noexcept; |
(C++11以降) | |
浮動小数点型Tで表現される特殊な値「signaling 非数」を返します。これは、std::numeric_limits<T>::has_signaling_NaN == true の場合にのみ意味があります。最も一般的な浮動小数点数の2進数表現であるIEEE 754では、指数部のすべてのビットがセットされ、かつ仮数部の少なくとも1つのビットがセットされている値はNaNを表します。仮数部のどの値がquiet NaNまたはsignaling 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は自身と比較しても等しくなりません。IEEE 754では、NaNのコピーがそのビット表現(符号およびペイロード)を保持することは要求されていませんが、ほとんどの実装では保持します。
arithmetic expression の引数として signaling NaN が使用されると、対応する浮動小数点例外が発生し、NaN は「quieted」つまり、式は quiet NaN を返します。
[編集] 例
浮動小数点例外を発生させるための signaling 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
[編集] 関連項目
| [static] |
特殊な値「signaling not-a-number」(NaN) を表現できる浮動小数点数型を識別する (public static member constant) |
| [static] |
与えられた浮動小数点数型の quiet NaN 値を返す (public static member function) |
| (C++11) |
与えられた数値が NaN かチェックする (関数) |