私は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
を返すことができるとき、それがどのように機能するか理解できませんか?
このメソッドは、特定の操作に対して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値を区別できません。
から Java言語仕様 :
浮動小数点等価テストは、IEEE 754標準の規則に従って実行されます。
いずれかのオペランドがNaNの場合、==の結果は偽になりますが、!=の結果は真になります。実際、x!= xのテストは、xの値がNaNの場合にのみtrueになります。 (メソッドFloat.isNaNおよびDouble.isNaNは、値がNaNであるかどうかをテストするためにも使用できます。)
正のゼロと負のゼロは等しいと見なされます。したがって、たとえば-0.0 == 0.0はtrueです。
それ以外の場合、2つの異なる浮動小数点値は、等価演算子によって等しくないと見なされます。特に、正の無限大を表す1つの値と負の無限大を表す1つの値があります。それぞれがそれ自体とのみ等しいと比較し、他のすべての値と等しくないと比較します。
NaNだけがfalseとそれ自身を比較するからです。したがって、NaN
をメソッドに渡すと、trueが返されます。
NaNとの比較は、それ自体と比較した場合でも、常に順序付けされていない結果を返します。 ...等式と不等式の述語は信号を送信しないため、x = xがfalseを返すことを使用して、xが静かなNaNかどうかをテストできます。
これはJavaだけでなく、IEEE754標準に準拠するすべての言語にも当てはまります。
Simple .. Nan
は常に!=NaN
であり、これらの値はどの値とも等しくありません。 this を参照してください:
すでに説明したように、NaNは順序付けされていないため、1つまたは2つのNaNを含む数値比較演算はfalseを返し、!=を含むすべての!=比較はtrueを返します。 。
したがって、v != v
は、value
がNaN
かどうかを判断するのに十分です。
私の知る限り NaN値 は何にも等しくありません。したがって、float v
、それ自体と同じになることは決してありません。