他のNAN値は何ですか?
-
23-09-2019 - |
質問
のドキュメント java.lang.Double.NaN
そうだと言います
タイプの非番号(nan)値を保持する一定
double
. 。それは、によって返される値に相当しますDouble.longBitsToDouble(0x7ff8000000000000L)
.
これは他の人がいることを意味しているようです。もしそうなら、どうすればそれらを手に入れることができますか、そしてこれは携帯的に行うことができますか?
明確にするために、私は見つけたいです double
値 x
そのような
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
と
Double.isNaN(x)
どちらも真実です。
解決
あなたが必要です doubleToRawLongBits
それよりも doubleToLongBits
.
doubleToRawLongBits
実際のバイナリ表現を抽出します。 doubleToLongBits
そうではありません、それはすべてを変換します NaN
sデフォルト NaN
最初。
double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));
出力:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
他のヒント
Javaは使用します IEEE 754 その浮動小数点数のために、したがって彼らのルールに従っています。
による ナンのウィキペディアページ このように定義されています:
IEEEフローティングポイント標準単一精度nanの少しの例:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
どこx
意味 気にしないでください.
したがって、かなりの数のビットパターンがあります。 NaN
値。
IEEE 754は、NANをすべての指数ビットを持つ数値として定義します。 1
マンティッサのゼロ以外の数。
したがって、あなたは探している単一の程度の番号については:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Javaはこれをそのように処理します:
Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true
要約すると、前述のルールに準拠する任意のNANを使用できます(指数とマンティッサ!= 0のすべてのビット1)。