web-dev-qa-db-ja.com

JavaのINFINITY定数とは何ですか?

私は最近、_Double.POSITIVE_INFINITY_や_Double.NEGATIVE_INFINITY_のようなプリミティブ型ラッパークラスの定数に遭遇しました。 APIでは、最初のものを次のように定義します。

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

他のものには、これらと同じ線に沿った定義があります。

私が問題を抱えているのは、これらの定数が実際に何であるかwhatを理解することです。彼らは実際にはbeまたはrepresent正/負の無限大はできないシステムは本質的に有限です。 Java作成者が無限の概念を定義すると考えているビットの単なる任意の設定ですか?それともこれらは実際に何らかの特別な値を持っていますか?isdoubleとして解釈されるビットの任意の文字列であり、そこに通常の数値があり、doubleとして解釈されると_POSITIVE_INFINITY_実際に期待される値の代わりに?

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

33
asteri

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

各IEEE 754浮動小数点数には、符号ビット、指数、仮数の3つのコンポーネントがあります。かなり単純化して、通常の数値の大きさは次のとおりです。

 mantissa * (2 ** exponent)

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

先行ビットは符号ビットです。 doubleでは、次の11ビットが指数です。

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

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

2つの無限大はどちらも2つのことを表すために使用されます。実際には無限の結果と、通常の数値システムでは表現できない絶対値が大きすぎる場合の結果です。 1.0/0.0は無限です。 2 * Double.MAX_VALUEも同様です。

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

20

彼らは確かにrepresent正と負の無限大を行います。これは IEEE浮動小数点標準 で明確に定義された概念です。たとえば、正の浮動小数点数をゼロで除算すると、正の無限大が生成されます。ビットパターン自体については、無限を表すために選択されたパターンにすぎません。

6

IEEE Standard 754 Floating Point Numbers 状態:

」値+ infinityおよび-infinityは、すべて1の指数およびすべて0の小数部で表されます。符号ビットは、負の無限大と正の無限大を区別します。無限大をaとして表すことができること特定の値は、操作で過去のオーバーフロー状態を継続できるため便利です。無限値の操作は、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
5
thedayofcondor