web-dev-qa-db-ja.com

Java isNanそれはどのように機能しますか?

私は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を返すことができるとき、それがどのように機能するか理解できませんか?

19
rascio

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

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

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

_Double.NaN_ のjavadocを参照してください:

Double.longBitsToDouble(0x7ff8000000000000L)が返す値と同じです

そして Double.longBitsToDouble()

引数が_0x7ff0000000000001L_から_0x7fffffffffffffffL_の範囲または_0xfff0000000000001L_から_0xffffffffffffffffL_の範囲のいずれかの値である場合、結果はNaNになります。 Javaによって提供されるIEEE 754浮動小数点演算は、ビットパターンが異なる同じタイプの2つのNaN値を区別できません。

20
Rohit Jain

から Java言語仕様

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

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

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

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

3
axtavt

NaNだけがfalseとそれ自身を比較するからです。したがって、NaNをメソッドに渡すと、trueが返されます。

NaNとの比較は、それ自体と比較した場合でも、常に順序付けされていない結果を返します。 ...等式と不等式の述語は信号を送信しないため、x = xがfalseを返すことを使用して、xが静かなNaNかどうかをテストできます。

ソース

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

関連質問: Double.NaN == Double.NaNがfalseを返す理由

2
xyz

Simple .. Nanは常に!=NaNであり、これらの値はどの値とも等しくありません。 this を参照してください:

すでに説明したように、NaNは順序付けされていないため、1つまたは2つのNaNを含む数値比較演算はfalseを返し、!=を含むすべての!=比較はtrueを返します

したがって、v != vは、valueNaNかどうかを判断するのに十分です。

1
Maroun

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

0
Suresh Atta