X 是一个小数,它进入一堆循环,不断从中减去某些小数,而 c 是一个整数,每次操作发生时都会递增 1。应该发生四个操作,但最后一个循环提前终止并且 c 永远不会从 3 增加到 4。最后一个 while 循环总是提前终止?
int main(void) {
float x = 0.41;
int c = 0;
while(x >= 0.25)
{
x-= 0.25;
c++;
}
while(x >= 0.1)
{
x-= 0.1;
c++;
}
while(x >= 0.05)
{
x-= 0.05;
c++;
}
while(x >= 0.01)
{
c++;
x-= 0.01;
}
printf("%i", c);
}
最佳答案
C 中的 float 不是绝对精确的。它们有 23 位来实际表示实际值。当你写作时
float x = 0.41
根据您的计算机架构/编译器,浮点值的实际表示与 exactly
0.41 略有不同。
要亲自查看,请将以下行添加到每个循环 block 中:
printf("%d, %.30f\n", c, x);
在我的机器上,我得到
1, 0.159999999999999975575093458247
2, 0.059999999999999970023978335121
3, 0.009999999999999967248420773558
在 C 中与 float 的比较应使用 epsilon 值来处理这些差异。在您的情况下,您应该允许比较值在目标值的范围内。有点像
#include <math.h>
...
while(fabs(x-0.01f) < 0.000001) //check that x is within a certain range of 0.01
主题引用:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
关于c - 为什么变量 c 在应该打印 4 时打印为 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28933077/