35

Double.POSITIVE_INFINITY最近、やのようなプリミティブ型ラッパークラスの定数に出くわしましたDouble.NEGATIVE_INFINITY。APIでは、最初のものを次のように定義します。

タイプdoubleの正の無限大を保持する定数。これは、Double.longBitsToDouble(0x7ff0000000000000L)によって返される値と同じです。

他のものは、これらの同じ線に沿って定義を持っています。

私が問題を抱えているのは、これらの定数が実際に何であるかを理解することです。システムは本質的に有限であるため、実際には正/負の無限大になることも表すこともできません。Javaの作成者が無限の概念を定義すると見なしたのは、ビットの任意の設定にすぎませんか?それとも、これらは実際に何らかの特別な価値を持っていますか?として解釈されるビットの任意の文字列である場合、実際に期待される値の代わりに、として解釈されるときに返される正規数はありますか?doubledoublePOSITIVE_INFINITY

Double.longBitsToDouble(0x7ff0000000000000L)APIの一部を考えると、これに対する答えが明白である場合は、ご容赦ください。正直なところ、その説明は私にはかなり難解であり、16進値が実際に何を意味するかまたは表すかを理解するふりをすることはありません。

4

3 に答える 3

21

Java浮動小数点は、IEEE754バイナリ浮動小数点標準FloatingPoint Standardに基づいており、その最初のバージョンは1985年頃に発行されたため、Javaよりもはるかに古いものです。Javaが定義されるまでにIEEE754のハードウェア実装が広まったことを考えると、Javaの作成者にはほとんど選択肢がありませんでした。

各IEEE754浮動小数点数には、符号ビット、指数、および仮数の3つのコンポーネントがあります。かなり単純化すると、正規数の大きさは次のようになります。

 mantissa * (2 ** exponent)

ここで、「**」は電力を表します。

先頭ビットは符号ビットです。ダブルスでは、次の11ビットが指数です。

すべての指数ビットがオンになっているビットパターンは、無限大とNaN用に予約されています。すべての正規数には、指数に少なくとも1つのゼロビットがあります。2つの無限大は、すべての指数ビットをオンにし、すべての仮数ビットをゼロにすることで表されます。先頭の符号ビットは、正の無限大と負の無限大を区別します。

特殊な場合のすべての指数ビット1の選択は任意ではありません。特にハードウェアの実装では、数値の範囲の中央にあるギャップに対処するよりも、極端なものの1つを切り落とす方が簡単です。特別な場合にすべてのビットを指数から外すと、すべてのビットをオフのパターンでゼロをエンコードできなくなり、最大の絶対等級値、無限大、最小の指数が与えられ、ハードウェアもより複雑になります。指数のすべてのビットは、無限大にとって間違いなく最良の選択です。

2つの無限大は両方とも、2つのことを表すために使用されます。実際には、無限の結果と、絶対等級が大きすぎて通常の記数法では表現できない結果、Double.MAX_VALUEより大きいまたは-Double.MAX_VALUEより小さい数です。1.0/0.0は無限大です。2*Double.MAX_VALUEも同様です。

どちらの意味でも、中間結果を無限にすることで、特殊なケースを減らして簡略化できるアルゴリズムがいくつかあります。そうすることで、たとえば、y軸に平行な線でさえ、計算に使用できる保存可能な勾配を持つことができます。

于 2012-11-10T00:40:39.560 に答える
6

それらは確かに正と負の無限大を表しており、 IEEE浮動小数点標準で明確に定義された概念です。たとえば、正の浮動小数点数をゼロで割ると、正の無限大になります。ビットパターン自体は、無限大を表すために選択されたパターンにすぎません。

于 2012-11-09T23:36:21.320 に答える
5

IEEE標準754浮動小数点数は次のように述べています。

「値+無限大と-無限大は、すべて1の指数とすべて0の小数部で表されます。符号ビットは、負の無限大と正の無限大を区別します。無限大を特定の値として表すことができると、次の操作が可能になるため便利です。オーバーフローの状況を超えて続行します。無限の値を使用する操作は、IEEE浮動小数点で明確に定義されています。」

また、 「特殊な数値に対する操作はIEEEによって明確に定義されています。最も単純なケースでは、NaNを使用する操作はすべてNaNの結果を生成します。その他の操作は次のとおりです。

      Operation         Result
        n ÷ ±Infinity   0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
       ±0 ÷ ±0          NaN
 Infinity - Infinity    NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN
于 2012-11-09T23:37:46.090 に答える