名前空間
変種
操作

std::isnan

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
ヘッダー <cmath> で定義
(1)
bool isnan( float num );

bool isnan( double num );

bool isnan( long double num );
(C++11以降)
(C++23まで)
constexpr bool isnan( /*浮動小数点型*/ num );
(C++23から)
ヘッダー <simd> で定義
template< /*math-floating-point*/ V >

constexpr typename /*deduced-simd-t*/<V>::mask_type

  isnan ( const V& v_num );
(S) (C++26以降)
ヘッダー <cmath> で定義
template< class Integer >
bool isnan( Integer num );
(A) (C++11以降)
(C++23 以降 constexpr)
1) 与えられた浮動小数点数 num が Not-a-Number (NaN) 値であるかどうかを判定します。ライブラリは、パラメータ num の型として、すべての cv-修飾されていない浮動小数点型に対するオーバーロードを提供します。(C++23以降)
S) SIMD オーバーロードは、v_num に対して要素ごとの std::isnan を実行します。
(定義については、math-floating-point および deduced-simd-t を参照してください。)
(C++26以降)
A) すべての整数型に対する追加のオーバーロードが提供されます。これらは double として扱われます。

目次

[編集] パラメータ

num - 浮動小数点数または整数値
v_num - 要素型が浮動小数点型である std::basic_simd の特殊化のデータ並列オブジェクト

[編集] 戻り値

1) true num が NaN の場合、それ以外の場合は false
S) i番目の要素が、範囲 [0v_num.size()) のすべての i について、v_num[i] が NaN である場合は true、そうでない場合は false となる、データ並列マスクオブジェクト。

[編集] 注記

異なる符号ビットとペイロードを持つ多くの異なる NaN 値が存在します。詳細については、std::nan および std::numeric_limits::quiet_NaN を参照してください。

NaN 値は、それ自身や他の NaN 値と比較しても決して等しくなりません。IEEE-754 では、NaN のコピーがそのビット表現(符号と ペイロード)を保持することが要求されていませんが、ほとんどの実装では保持されます。

浮動小数点値が NaN であるかどうかをテストする別の方法は、それ自身と比較することです。bool is_nan(double x) { return x != x; }

GCC および Clang は、-ffinite-math オプション(-ffast-math によって暗黙的に有効になる場合もあります)をサポートしており、これにより、それぞれのコンパイラは NaN、無限大、または負ゼロのような特殊な IEEE-754 浮動小数点値の非存在を仮定できます。言い換えると、このオプションの下では、std::isnan は常に false を返すと仮定されます。

追加のオーバーロードは、正確に (A) のように提供される必要はありません。整数型の引数 num に対して、std::isnan(num)std::isnan(static_cast<double>(num)) と同じ効果を持つことを保証するだけで十分です。

[編集]

#include <cfloat>
#include <cmath>
#include <iostream>
 
int main()
{
    std::cout << std::boolalpha
              << "isnan(NaN) = " << std::isnan(NAN) << '\n'
              << "isnan(Inf) = " << std::isnan(INFINITY) << '\n'
              << "isnan(0.0) = " << std::isnan(0.0) << '\n'
              << "isnan(DBL_MIN/2.0) = " << std::isnan(DBL_MIN / 2.0) << '\n'
              << "isnan(0.0 / 0.0)   = " << std::isnan(0.0 / 0.0) << '\n'
              << "isnan(Inf - Inf)   = " << std::isnan(INFINITY - INFINITY) << '\n';
}

出力

isnan(NaN) = true
isnan(Inf) = false
isnan(0.0) = false
isnan(DBL_MIN/2.0) = false
isnan(0.0 / 0.0)   = true
isnan(Inf - Inf)   = true

[編集] 関連項目

(C++11)(C++11)(C++11)
非数 (not-a-number, NaN)
(関数) [編集]
与えられた浮動小数点数値を分類する
(関数) [編集]
(C++11)
与えられた数値が有限値かチェックする
(関数) [編集]
(C++11)
与えられた数値が無限大かチェックする
(関数) [編集]
(C++11)
与えられた数値が正規化数かチェックする
(関数) [編集]
2つの浮動小数点数値が順序付けられていないかチェックする
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)