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);
}
答案 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),那么你需要将它加到零四次才能大于或等于一。