Double.MIN_NORMAL
(Java 1.6 で導入) との違いは何Double.MIN_VALUE
ですか?
3 に答える
答えは、浮動小数点表現の IEEE 仕様にあります。
単一形式の場合、正規数と非正規数の違いは、正規数の仮数の先頭ビット (2 進小数点の左側のビット) が 1 であるのに対し、非正規数の仮数の先頭ビットは 1 であることです。 number は 0 です。単一形式の非正規数は、IEEE 標準 754 では単一形式の非正規化数と呼ばれていました。
つまり、Double.MIN_NORMAL
2 進小数点 (10 進法で小数点と呼ばれるもの) の前に 1 がある場合に、表現できる最小の数です。WhileDouble.MIN_VALUE
は基本的に、この制約なしで表現できる最小の数です。
IEEE-754 binary64 形式:
s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm
(1 s
; 3×4−1 =11e
秒; 64−3×4 =52m
秒)
、およびそのアルゴリズム:
e >000_0000_0000
との場合: s ×2 e−balancer:1023 × base:1 +m×2 −sub-one-pusher:52<111_1111_1111
と解釈します。(これらは通常の数値です。)(-1)
(
)
If : isとis
e =000_0000_0000
を除いて (上記の行と同じ) を実行します。(これらは、非正規/正規ではないゼロを除いて、非正規数です。)base:1
base:0
e
e +1
e =111_1111_1111
およびの場合: s × 無限大m =0000...0000
として解釈します。(-1)
e =111_1111_1111
およびm <>0000...0000
: NaN として解釈します。(ちなみに: したがって、NaN には 2×(
2 52 −1)
の異なるビット表現があります。 #Quiet NaN &を参照してくださいdoubleToRawLongBits
。)
したがって:
可能な正の数の最小値は
0_000_0000_0000_0000_..._0001
(Double.MIN_VALUE
(.NET のDouble.Epsilon
)) (非正規数) です。可能な正の正規数の最小値は
0_000_0000_0001_0000_..._0000
(Double.MIN_NORMAL
) です。
付録:
MIN_VALUE
計算:
(-1) s:0 ×2 (e:0+1)−バランサー:1023 ×(ベース:0 +m:1 ×2 −サブワンプッシャー:52 )
= 1 ×2 −1022 ×2 −52
= 2 −1074 ( ~4.94 × 10 −324 )
、およびMIN_NORMAL
計算:
(-1) s:0 ×2 e:1 −バランサー:1023 ×(ベース:1 +m:0 ×2 −サブワンプッシャー:52 )
= 1 ×2 −1022 ×1
= 2 −1022 ( ~2.225 × 10 −308 )
簡単にするために、説明は正の数だけを考慮します。
2 つの隣接する正規化された浮動小数点数'x1' と 'x2' の間の最大間隔は です2 * epsilon * x1
(正規化された浮動小数点数は等間隔ではなく、対数間隔になっています)。つまり、実数(つまり、「数学的な」数) が浮動小数点数に丸められる場合、最大相対誤差はであり、これはマシン イプシロンまたは単位の丸めepsilon
と呼ばれる定数であり、倍精度の場合、値は 2 になります。 ^-52 (近似値 2.22e-16)。
より小さい浮動小数点数Double.MIN_NORMAL
はサブノーマルと呼ばれ、0 と の間のギャップを均等に埋めていDouble.MIN_NORMAL
ます。つまり、サブノーマルを含む計算では、結果の精度が低下する可能性があります。サブノーマルを使用すると、結果が小さい場合に計算の精度が低下する速度が遅くなります。