为什么变量c在打印4时打印为3?

时间:2015-03-08 23:19:17

标签: c while-loop

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);

}

3 个答案:

答案 0 :(得分:2)

C中的浮点数并不是绝对精确的。它们有23位实际代表实际值。当你写

float x = 0.41

浮点值中值的实际表示与exactly 0.41略有不同,具体取决于您的计算机体系结构/编译器。

要亲眼看看,请在每个循环块中添加以下行:

printf("%d, %.30f\n", c, x);

在我的机器上,我得到了

1, 0.159999999999999975575093458247
2, 0.059999999999999970023978335121
3, 0.009999999999999967248420773558

对于这些差异,应使用epsilon值处理C中浮点数的比较。在您的情况下,您应该允许比较值在目标值的范围内。像

这样的东西
#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

答案 1 :(得分:0)

while(x >= 0.05)
{
    x-= 0.05;
    c++;
}

while(x >= 0.1)
{
    c++;
    x-= 0.01;
}

尝试将这些转换为这些

while(x >= 0.1)
{
    c++;
    x-= 0.01;
}
while(x >= 0.05)
{
    x-= 0.05;
    c++;
}

答案 2 :(得分:0)

精确比较不会与有限精度混合。如果你用一些十进制数字表示1/3(0.3333333),那么你需要将它加到零次才能大于或等于一。