java.lang.Doubleの実装における矛盾(OracleのJDK 1.8)?

マルクスSteppberger:

私はの実装を見てjava.lang.Doubleクラス。値はNaN、指定した値です0x7ff8000000000000Lpublic static final double NaNフィールドがに設定されている0.0d / 0.0と評価されるべき0x7ff8000000000000LJVMは、そのように実装しなければ。

  1. なぜ、この値は(た0x7ff8000000000000L)選ばれましたか?その値(例えばそのビットマスク)については何の特別なはありますか?

  2. なぜフィールドは、暗黙的にその値に設定しての基本的な実装に依存している0.0d / 0.0静的メソッドは、一方の操作public static long doubleToLongBits(double value)に明示的に値を設定0x7ff8000000000000LするためにNaN、引数?暗黙のうちに結果としてそれを設定することがはるかに安全ではなかった0.0d / 0.0非常にJVMの実装に依存し、理論的には(ほとんどの場合、それは決して)に変更されるだろうか?

同じことがのために行くPOSITIVE_INFINITYNEGATIVE_INFINITYフィールドは、暗黙的にその値に設定されているが、いくつかの方法が明示的に指定された値を使用します。その背後にある理由はありますか?

何かを学ぶために私を助けてくれてありがとうは毎日:-)新しいです。

アンディ・ターナー:

public static final double NaNフィールドがに設定されている0.0d / 0.0と評価されるべき0x7ff8000000000000LJVMは、そのように実装しなければ。

ありません:それは、その結果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この方法は、返すために持っている、これは、彼らが戻ることを選んだ値であるので、値を。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185601&siteId=1