iは、次のような状況で私はオーバーフローを取得しない理由を理解しようとしています:なぜdouble変数を使用するとオーバーフローしませんか?
double x = 1.7976931348623157E+308; //this is the max value of double
x = x + 0.5;
私はまだsame result
を得る0.5を追加した後、xの値をチェックします。
誰でも?
iは、次のような状況で私はオーバーフローを取得しない理由を理解しようとしています:なぜdouble変数を使用するとオーバーフローしませんか?
double x = 1.7976931348623157E+308; //this is the max value of double
x = x + 0.5;
私はまだsame result
を得る0.5を追加した後、xの値をチェックします。
誰でも?
一般に値を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
指数表記との類似を考えます。
あなたは4桁の数字が許可されているとしますので、数字1234000.0
は1.234e6
で表されます。
今度は0.5
を追加してください。これは1234000.5
です。
中間バッファがその重要度を保持するのに十分な大きさであっても、その制限内の表現はまだ1.234e6
です。
しかし、中間バッファは、たとえば、唯一の7桁の数字を保持することができれば、追加するための整列値が
1234000
0
-------
1234000
あるので0.5
は加算が行われる前であってもその意義を失います。 double
の場合、中間バッファには308桁の相当量を保持できないことがあります。
「*ダブル*」は精度***が***に制限されていますが、 – alk
加算のために「0.5」が整列されるまでに、(その指数に一致するように)仮数をシフトすることによってその有意性が失われるので、単に「0」を加算するだけです。 –
仮数部に52ビットがある場合、これは2つのオペランドの指数が52以上異なる場合に発生します。これは加算または減算の場合です。乗算と除算は別の問題です。 –