使用浮点变量作为循环计数器及其在非“==”条件下的小数增量/减量是否存在风险?

2023-11-27

我们可以安全地使用浮点数作为循环计数器并在每次迭代时按小数部分递增/递减它们吗,就像下面看似无风险的程序一样?当然我知道使用浮点数作为操作数==但是,出于“正常”目的,使用浮点数作为其他比较运算的操作数有什么问题呢?我所说的“正常”是指,好吧,即使浮动可能不是exact数字的数字表示,但不是像这样的变体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);
}

Output:

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 ok when f初始化为1.0。但将其更改为 3.0 - 事情开始出现问题更有意思的不一会儿:

2.600000
2.500000
2.400001
...
0.000001

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


你认为你可能会安全>=代替>? Think 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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用浮点变量作为循环计数器及其在非“==”条件下的小数增量/减量是否存在风险? 的相关文章

随机推荐