web-dev-qa-db-ja.com

Doubleが「NaN」であるかどうかを確認する最短の方法

_Double.PositiveInfinity_を引数としてDouble.IsNaN()を呼び出すと、結果は偽になります。無限は数ではないので、これは私の直感に反します。明らかに「NaN」は.NETの定数に関してのみ存在しますが、これはIEEE標準で記述されているのですか、それともカスタム実装の詳細ですか? Doubleが「NaN」であるかどうかを確認するより短い方法はありますか:

_(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))
_

または

_(Double.IsNaN(d) || Double.IsInfinity(d))
_
34

MSDNが言うように、 NaN は結果が未定義であることを意味します。無限大で結果が定義されます:

操作の結果が未定義の場合、メソッドまたは演算子はNaNを返します。たとえば、次の例に示すように、ゼロをゼロで除算した結果はNaNです。 (ただし、ゼロ以外の数値をゼロで除算すると、除数の符号に応じてPositiveInfinityまたはNegativeInfinityが返されることに注意してください。)

したがって、無限大をNaNとして扱うのは得策ではありません。拡張メソッドを記述して、値がNaNまたは無限大ではないかどうかを確認できます。

// Or IsNanOrInfinity
public static bool HasValue(this double value)
{
    return !Double.IsNaN(value) && !Double.IsInfinity(value);
}
52

Doubleタイプには3つの特別な値があり、これは IEEE規格754 に基づいています。 1つは正の無限大、もう1つは負の無限大、最後は非数(NaN)です。すべてDouble.IsNaNメソッドは、変数の値がこの特別なNaN値であるかどうかを確認します。

2
Tony Vitabile