質問

のドキュメント java.lang.Double.NaN そうだと言います

タイプの非番号(nan)値を保持する一定 double. 。それは、によって返される値に相当します Double.longBitsToDouble(0x7ff8000000000000L).

これは他の人がいることを意味しているようです。もしそうなら、どうすればそれらを手に入れることができますか、そしてこれは携帯的に行うことができますか?

明確にするために、私は見つけたいです doublex そのような

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)

Double.isNaN(x)

どちらも真実です。

役に立ちましたか?

解決

あなたが必要です doubleToRawLongBits それよりも doubleToLongBits.

doubleToRawLongBits 実際のバイナリ表現を抽出します。 doubleToLongBits そうではありません、それはすべてを変換します NaNsデフォルト 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)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top