2017-05-23 6 views
-2

Javaのdoubleが、±5,0*10(^-324)から±1,7*10(^308)までの特定の値の範囲を持つのはなぜですか?なぜそれが好きではないのですか?±5,0*10(^-324)±5,0*10(^308)または±1,7*10(^-324)±1,7*10(^308)?あなたの質問へなぜdoubleに特定の範囲の値があるのですか? (Java)

+8

IEEE-754が指定されているため、https://en.wikipedia.org/wiki/IEEE_f loating_point –

+1

特定の範囲を持たない場合、 'double'は表現できません。 (あなたは無限大の数値を有界のメモリで表現することはできません) –

+0

私の答えを見て、それを掘るのに時間がかかりました:) – 11thdimension

答えて

1

回答は非正規数、Javaで

https://en.wikipedia.org/wiki/Denormal_number

ダブル浮動小数点数はIEEE 754で定義されたフォーマットに基づいており、チェック以下のリンクです。

説明については、このリンクを参照してください。

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

  1. 浮動小数点数は
    1. サインビット以下に分割され64 bits
    2. 64ビットで表現されたルールの簡単なセットされる次のとおりの1 bit(符号は数)
    3. 指数:11 bits(署名)
    4. 仮数精度(フラクション):私たちは、この設定から取得52 bits

double bits

番号の範囲は

-1022 <= Exponent <= 1023 (total 2046) (excluding 0 and 2047, they have special meanings) 


000 (0 in base 16) is used to represent a signed zero (if F=0) and subnormals (if F≠0); and 
7ff (2047 in base 16) is used to represent ∞ (if F=0) and NaNs (if F≠0), 

https://en.wikipedia.org/wiki/Exponent_bias

ですそして

-2^52 <= Fraction <= 2^52 

だから表すことができる最小値および最大値が

Min positive double = +1 * 2^(-1022) ≈ 2.225 * 10(−308) 
Note: 1022 * Math.log(2)/Math.log(10) = 307.652 
     and Math.pow(10, 1 - .652) = 2.228 (.652 is approximation) 

Max positive double = +(2^52) * (2^1023) = 1.797 * 10^308 

されるように、範囲は[-2.225×10(-308)、1.797 * 10^308]

なります

この範囲の変化に起因するsubnormal numbers

非正規数であります数値は、仕様で定義されている最小標準の の数値よりも小さくなります。

数字が0.00123の場合、1.23 * 10^(-3)と表示されます。仕様による浮動小数点数には、先行ゼロはありません。したがって、先行ゼロのある数字がある場合は、デフォルトのExponentに追加されます。だから先行ゼロで可能な最小指数を持つ数値がある場合、先行ゼロは負の指数に加算されます。

signifand (fraction)には52ビットがあります。したがって、バイナリ内の先行ゼロの最大数は51になる可能性があります。次の番号を効果的に生成する。

Min positive Subnormal = 1 * 2^-52 * (2^-1022) = 2^(-2074) ≈ 4.9·10^(−324) 

Note: 1074 * Math.log(2)/Math.log(10) = 323.306 
     Math.pow(10, 1 - 0.306) = 4.943 

だから、あなたはそれを持って、範囲が今

ある[ - ミン非正規数、+マックス通常の数]

または

[ - 4.9 * 10 ^( -324)、+ 1.79769 * 10^308]

関連する問題