为什么使用双变量时没有溢出?
why no overflow when using double variable?
我想了解为什么在以下情况下我没有溢出:
double x = 1.7976931348623157E+308; //this is the max value of double
x = x + 0.5;
在添加 0.5 后检查 x 的值时,我仍然得到 same result
。
有人吗?
通常,如果您想将一个值添加到双精度 x
,添加的值应该在精度范围内,以便它完全改变该值。
对于 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 位等效数字。
我想了解为什么在以下情况下我没有溢出:
double x = 1.7976931348623157E+308; //this is the max value of double
x = x + 0.5;
在添加 0.5 后检查 x 的值时,我仍然得到 same result
。
有人吗?
通常,如果您想将一个值添加到双精度 x
,添加的值应该在精度范围内,以便它完全改变该值。
对于 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 位等效数字。