10

ドキュメントにjava.lang.Double.NaNは、

タイプのNot-a-Number(NaN)値を保持する定数double。これは、によって返される値と同等Double.longBitsToDouble(0x7ff8000000000000L)です。

これは他にもあることを意味しているようです。もしそうなら、どうすればそれらを手に入れることができますか、そしてこれは移植可能に行うことができますか?

明確にするために、私は次のようなdouble値を見つけたいと思いますx

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

Double.isNaN(x)

どちらも真実です。

4

3 に答える 3

12

doubleToRawLongBitsではなく必要ですdoubleToLongBits

doubleToRawLongBits実際のバイナリ表現を抽出します。 doubleToLongBits そうではなく、最初にすべてNaNのをデフォルトに変換します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
于 2010-01-28T13:54:06.050 に答える
7

Javaは浮動小数点数にIEEE754を使用するため、その規則に従います。

NaNのウィキペディアのページによると、次のように定義されています。

IEEE浮動小数点標準の単精度NaNのビット単位の例:x111 1111 1axx xxxx xxxx xxxx xxxx xxxxここで、はドントケアxを意味します。

したがって、かなりの数のビットパターンがあり、それらはすべてNaN値です。

于 2010-01-28T12:40:02.617 に答える
3

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を使用できます(指数および仮数のすべてのビット1!= 0)。

于 2010-01-28T12:39:43.007 に答える