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

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

Double.POSITIVE_INFINITY私はつい最近、やのようなプリミティブ型ラッパー クラスの定数に遭遇しましたDouble.NEGATIVE_INFINITY。 API では、最初の定数は次のように定義されています。

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

他にも同様の定義があります。

私が困っているのは理解することですこれらの定数は実際にはなれまたは代表する正負の無限大は、システムが本質的に有限であるため、無限大ではありません。これは、Javaの開発者が無限大の概念を定義すると考えたビットの任意の設定なのでしょうか?それとも、これらは実際に何らかの特別な値を持っているのでしょうか?単なる任意のビット文字列を として解釈する場合、 として解釈されたときに、実際に予想される値の代わりに返されるdouble通常の数値は存在しますか?doublePOSITIVE_INFINITY

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

ベストアンサー1

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

各 IEEE 754 浮動小数点数には、符号ビット、指数、仮数の 3 つの要素があります。大幅に簡略化すると、通常の数値の大きさは次のようになります。

 mantissa * (2 ** exponent)

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

先頭のビットは符号ビットです。double の場合、次の 11 ビットは指数です。

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

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

2 つの無限大は、どちらも 2 つのことを表すために使用されます。つまり、実際には無限の結果と、通常の数値システムでは絶対値が大きすぎて表せない結果 (Double.MAX_VALUE より大きい数値、または -Double.MAX_VALUE より小さい数値) です。1.0/0.0 は無限大です。2*Double.MAX_VALUE も無限大です。

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

おすすめ記事