22

私はopenjdk-1.7.0_25ソースコードを見ていましたが、この方法を見ました:

/**
 * Returns {@code true} if the specified number is a
 * Not-a-Number (NaN) value, {@code false} otherwise.
 *
 * @param   v   the value to be tested.
 * @return  {@code true} if the argument is NaN;
 *          {@code false} otherwise.
 */
static public boolean isNaN(float v) {
    return (v != v);
}

このメソッドが返すことができるとき、私はそれがどのように機能するのか理解できませんtrueか?

4

5 に答える 5

25

そのメソッドは、特定の操作に対してtrueを返すことができます。次に例を示します。

System.out.println(Float.isNaN(0.0f / 0.0f));
System.out.println(Double.isNaN(Math.sqrt(-1)));

基本的にNaN、未定義の値を表します。の値0.0 / 0.0NaN、およびNan != NaNです。Math.sqrt(-1)も得られるため、論理的に見えるかもしれませんNaN

次の javadoc を参照してくださいDouble.NaN

によって返される値と同等です。Double.longBitsToDouble(0x7ff8000000000000L)

そしてDouble.longBitsToDouble()

引数が ~ の範囲または ~ の範囲の任意の値である場合、0x7ff0000000000001L結果は. Java が提供する IEEE 754 浮動小数点演算では、ビット パターンが異なる同じ型の 2 つの NaN 値を区別できません。0x7fffffffffffffffL0xfff0000000000001L0xffffffffffffffffLNaN

于 2013-08-26T11:00:44.347 に答える
3

Java言語仕様から:

浮動小数点の等価性テストは、IEEE 754 標準の規則に従って実行されます。

  • いずれかのオペランドが NaN の場合、== の結果は false ですが、!= の結果は true です。実際、テスト x!=x は、x の値が NaN の場合にのみ真になります。(メソッド Float.isNaN および Double.isNaN を使用して、値が NaN かどうかをテストすることもできます。)

  • 正のゼロと負のゼロは等しいと見なされます。したがって、たとえば -0.0==0.0 は true です。

  • それ以外の場合、2 つの異なる浮動小数点値は、等値演算子によって等しくないと見なされます。特に、正の無限大を表す 1 つの値と負の無限大を表す 1 つの値があります。each はそれ自体とのみ等しいと比較され、each は他のすべての値と等しくないと比較されます。

于 2013-08-26T11:01:46.263 に答える
2

NaN のみが false をそれ自体と比較するためです。したがって、メソッドに渡すと true が返されますNaN

NaN との比較は、それ自体との比較であっても、常に順不同の結果を返します。... 等式および不等式の述語は非シグナリングであるため、x = x が false を返すことを使用して、x が quiet NaN であるかどうかをテストできます。

ソース

これは Java だけでなく、IEEE754 規格に準拠するすべての言語にも当てはまります。

関連する質問: Double.NaN==Double.NaN が false を返すのはなぜですか?

于 2013-08-26T11:01:14.193 に答える
0

私の知る限り、NaN 値は何にも等しくありません。したがって、渡されたときfloat v、それ自体と等しくなることはありません。

于 2013-08-26T11:01:54.413 に答える