私はの実装を見てjava.lang.Double
クラス。値はNaN
、指定した値です0x7ff8000000000000L
。public static final double NaN
フィールドがに設定されている0.0d / 0.0
と評価されるべき0x7ff8000000000000L
JVMは、そのように実装しなければ。
なぜ、この値は(た
0x7ff8000000000000L
)選ばれましたか?その値(例えばそのビットマスク)については何の特別なはありますか?なぜフィールドは、暗黙的にその値に設定しての基本的な実装に依存している
0.0d / 0.0
静的メソッドは、一方の操作public static long doubleToLongBits(double value)
に明示的に値を設定0x7ff8000000000000L
するためにNaN
、引数?暗黙のうちに結果としてそれを設定することがはるかに安全ではなかった0.0d / 0.0
非常にJVMの実装に依存し、理論的には(ほとんどの場合、それは決して)に変更されるだろうか?
同じことがのために行くPOSITIVE_INFINITY
とNEGATIVE_INFINITY
。フィールドは、暗黙的にその値に設定されているが、いくつかの方法が明示的に指定された値を使用します。その背後にある理由はありますか?
何かを学ぶために私を助けてくれてありがとうは毎日:-)新しいです。
public static final double NaN
フィールドがに設定されている0.0d / 0.0
と評価されるべき0x7ff8000000000000L
JVMは、そのように実装しなければ。
ありません:それは、その結果NaN
ごとに、言語仕様:
NaNのゼロ結果によるゼロ除算
0x7ff8000000000000L
されているlong
、ではないdouble
、したがって、それは直接初期化フィールドとして使用することができません。
文書は、Double.NaN
その値が「によって返された値と等価であることの状態を行いますDouble.longBitsToDouble(0x7ff8000000000000L)
。」しかし、0.0d / 0.0
それはコンパイル時の定数値であるため、メソッド呼び出しがないのに対し、フィールドを初期化することに優先して使用されます。
(のための恥知らずなプラグそれがある理由についての私の答えは0.0d
、ありません0.0
)
なぜ、この値は(た
0x7ff8000000000000L
)選ばれましたか?
で述べたようにJLS秒4.2.3:
IEEE 754は、単一および倍精度浮動小数点フォーマットの各々について複数の別個のNaN値を可能にします。各ハードウェアアーキテクチャは、NaNのための特定のビットパターン新規のNaNが発生した場合、プログラマはまた、例えば、符号化に異なったビットパターンとNaNを作成することができ、遡及的な診断情報を返しています。
単一の標準値に崩壊しているかのようにほとんどの部分については、Java SEプラットフォームは、特定のタイプのNaN値を扱い、したがって本明細書は、通常正規値にあるかのように任意のNaNを指します。
Double.longBitsToDouble
この方法は、返すために持っている、これは、彼らが戻ることを選んだ値であるので、値を。