web-dev-qa-db-ja.com

Javaの `Double.MIN_NORMAL`と` Double.MIN_VALUE`の違いは?

Double.MIN_NORMAL (Java 1.6)で導入)と Double.MIN_VALUE の違いは何ですか?

45
Cheok Yan Cheng

答えは 浮動小数点表現のIEEE仕様 にあります。

単一形式の場合、正規数と非正規数の違いは、正規数の仮数の先頭ビット(バイナリポイントの左側のビット)が1であるのに対し、非正規数の仮数の先頭ビットは0です。単一フォーマットの非正規化数は、IEEE標準754では単一フォーマットの非正規化数と呼ばれていました。

言い換えると、 Double.MIN_NORMALは、2進小数点(10進法では小数点と呼ばれる)の前に1がある場合に、表現できる最小の数値です。 Double.MIN_VALUEは基本的に、この制約なしで表現できる最小の数です。

28
aioobe

簡単にするために、説明では正の数のみを考慮します。

2つの隣接する正規化浮動小数点数 'x1'と 'x2'の間の最大間隔は2 * epsilon * x1です(正規化浮動小数点数は均等ではありません)間隔を空けて、それらは対数間隔で配置されます)。つまり、実数(つまり「数学」の数)が浮動小数点数に丸められると、最大値相対誤差epsilonであり、これはマシンイプシロンまたは 単位丸め と呼ばれる定数であり、倍精度の場合は値2 ^になります。 -52(概算値2.22e-16)。

Double.MIN_NORMALより小さい浮動小数点数は非正規化数と呼ばれ、0とDouble.MIN_NORMALの間のギャップを均等に埋めています。つまり、非正規化数を含む計算では、結果の精度が低下する可能性があります。非正規化数を使用すると、結果が小さい場合に計算の精度が低下するのが遅くなります。

2
Andrei Bozantan