Double.MIN_NORMAL
(Java 1.6)で導入)と Double.MIN_VALUE
の違いは何ですか?
答えは 浮動小数点表現のIEEE仕様 にあります。
単一形式の場合、正規数と非正規数の違いは、正規数の仮数の先頭ビット(バイナリポイントの左側のビット)が1であるのに対し、非正規数の仮数の先頭ビットは0です。単一フォーマットの非正規化数は、IEEE標準754では単一フォーマットの非正規化数と呼ばれていました。
言い換えると、 Double.MIN_NORMAL
は、2進小数点(10進法では小数点と呼ばれる)の前に1がある場合に、表現できる最小の数値です。 Double.MIN_VALUE
は基本的に、この制約なしで表現できる最小の数です。
簡単にするために、説明では正の数のみを考慮します。
2つの隣接する正規化浮動小数点数 'x1'と 'x2'の間の最大間隔は2 * epsilon * x1
です(正規化浮動小数点数は均等ではありません)間隔を空けて、それらは対数間隔で配置されます)。つまり、実数(つまり「数学」の数)が浮動小数点数に丸められると、最大値相対誤差はepsilon
であり、これはマシンイプシロンまたは 単位丸め と呼ばれる定数であり、倍精度の場合は値2 ^になります。 -52(概算値2.22e-16)。
Double.MIN_NORMAL
より小さい浮動小数点数は非正規化数と呼ばれ、0とDouble.MIN_NORMAL
の間のギャップを均等に埋めています。つまり、非正規化数を含む計算では、結果の精度が低下する可能性があります。非正規化数を使用すると、結果が小さい場合に計算の精度が低下するのが遅くなります。