2016-06-15 3 views
0

iは、次のような状況で私はオーバーフローを取得しない理由を理解しようとしています:なぜdouble変数を使用するとオーバーフローしませんか?

double x = 1.7976931348623157E+308; //this is the max value of double 

x = x + 0.5; 

私はまだsame resultを得る0.5を追加した後、xの値をチェックします。

誰でも?

+2

「*ダブル*」は精度***が***に制限されていますが、 – alk

+1

加算のために「0.5」が整列されるまでに、(その指数に一致するように)仮数をシフトすることによってその有意性が失われるので、単に「0」を加算するだけです。 –

+0

仮数部に52ビットがある場合、これは2つのオペランドの指数が52以上異なる場合に発生します。これは加算または減算の場合です。乗算と除算は別の問題です。 –

答えて

0

一般に値をdoubleに追加する場合は、加算値は値を変更する精度の範囲内にある必要があります。

doubleの場合、〜16桁の精度が得られます。したがって、加算された値が(x/1E + 16)より小さい場合、結果に変更はありません。

少し試行錯誤して、あなたのケースでは、1E+292という値を指定したdoubleに加算すると、+ INFという結果が得られます。

double x = 1.7976931348623157E+308; //this is the max value of double 

x = x + 1E+292; 
printf ("\nx = %lf",x); 

結果

X = 1#のINF00

0

指数表記との類似を考えます。

あなたは4桁の数字が許可されているとしますので、数字1234000.01.234e6で表されます。

今度は0.5を追加してください。これは1234000.5です。

中間バッファがその重要度を保持するのに十分な大きさであっても、その制限内の表現はまだ1.234e6です。

しかし、中間バッファは、たとえば、唯一の7桁の数字を保持することができれば、追加するための整列値が

1234000 
     0 
------- 
1234000 

あるので0.5は加算が行われる前であってもその意義を失います。 doubleの場合、中間バッファには308桁の相当量を保持できないことがあります。

関連する問題