为什么使用双变量时没有溢出?

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 位等效数字。