gpt4 book ai didi

c - float 的最大值

转载 作者:太空宇宙 更新时间:2023-11-04 05:17:40 25 4
gpt4 key购买 nike

对于以下循环,我期望输出为 sum = 20e6 但输出为 sum = 1.67772e+07

float sum=0.0f;
for(i=0;i<20e6;i++)
sum = sum + 1.0f;
printf("sum = %g\n", sum);

问题 1:为什么 sum 是 float 不能容纳大于 1.67772e07 的值?

问题 2: 如果我将循环中的语句更改为 sum = sum + 1.001f; 那么 sum 的最终值为 2.32229e+07。为什么 sum 的值会出现这种差异?

问题 3:我们能否在上面的循环中控制这种行为,以便我们可以对大于 1.67772e07 的值使用 float,同时仍以 1.0f 递增?

最佳答案

在某些时候,最接近x + 1.0f 的可表示值是x 本身。达到该点后,由于此舍入错误,您的循环将不会导致 sum 进一步增加。

举例来说,您可以使用具有固定数量有效数字的科学记数法来观察这种效果。例如,有 4 位有效数字:

    0 = 0.000e0
1 = 1.000e0
2 = 2.000e0
3 = 3.000e0

...

    9 = 9.000e0
10 = 1.000e1
11 = 1.100e1

...

  99 = 9.900e1
100 = 1.000e2
101 = 1.010e2

...

  999 = 9.990e2
1000 = 1.000e3
1001 = 1.001e3

...

 9999 = 9.999e3
10000 = 1.000e4

如果你再加一个,你应该得到 1.0001e4,但是由于只保留了 4 位有效数字,所以存储的值为 1.000e4,例如10000 + 1 = 10000 在这个系统中,继续递增只是永远重复这个计算而不改变结果。

您的代码以完全相同的方式工作,除了 float 使用二进制 float ,而不是像科学记数法那样使用小数。但是有效二进制数字的数量仍然有限,当加 1 不会改变这些有效数字之一时,sum 停止增加。

它有点复杂,因为对于二进制,“正确”的结果在两个可表示数字的中间,因此舍入可能发生向下或向上,在这种情况下您要求加 1 但实际上得到更高的结果 2。在任何情况下,一旦可表示值之间的距离变为 4,尝试加 1 将无效。

关于c - float 的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com