gpt4 book ai didi

c - 使用浮点变量作为循环计数器及其在非 "=="条件下的小数递增/递减有任何风险吗?

转载 作者:太空狗 更新时间:2023-10-29 15:09:57 24 4
gpt4 key购买 nike

我们是否可以安全地将 float 用作循环计数器并在每次迭代中按小数递增/递减它们,就像在下面看似无风险的程序中一样?当然我知道使用 float 作为 的操作数== 运算符是一件愚蠢的事情。但是使用 float 作为“正常”目的的其他比较操作的操作数有什么问题呢? “正常”的意思是,虽然 float 可能不是数字的精确数字表示,但不是像0.000000001这样无关紧要的变体,可以是在大多数情况下被忽略? (例如在下面的程序中甚至不明显)

但话虽如此,这是我的担忧。假设表示不准确,5.0 实际上是 4.999999。所以当我们继续递减 0.5 在每次迭代中,最后一次与0 的比较结果可能为假,并可能由于相差0.000001 而退出循环,当前输出的最后一行不会显示。我希望你明白我的意思。我错在哪里?

#include<stdio.h>

int main(void)
{
float f;

for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}

输出:

5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000

最佳答案

不,由于您的问题中给出的原因,它不安全。考虑一下:

#include<stdio.h>

int main(void) {
float f = 1.0;

for(;f>0;f-=0.1)
printf("%f\n",f);
return 0;
}

这个例子似乎有效 quite okf1.0 初始化时。但是将其更改为 3.0 - 事情开始变得顺利 more interesting很快:

2.600000
2.500000
2.400001
...
0.000001

...导致臭名昭著的“差一个”失败。


您认为使用 >= 而不是 > 可能更安全?想想again :

float f = 5.0;
for(;f>=1;f-=0.4)
printf("%f\n",f);

...
3.400000
3.000000
2.599999
2.199999
1.799999
1.399999

... 我们再次逐一进行(因为 0.99999 小于 1)。

关于c - 使用浮点变量作为循环计数器及其在非 "=="条件下的小数递增/递减有任何风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595668/

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