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

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

}

最佳答案

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/

相关文章:

Cscope问题——搜索结果不可见

c++ - 从 char 指针中减去 char 数组产生一个 int?

java - 在 while 循环中将字符串和整数添加到不同的 ArrayList

php - 将 2 个字段组合到一张表中以容纳 43,000 条记录

c - while 循环运行一次迭代,不管

c - 调整终端大小后 box() 如何采用最大宽度

c - 如何打印C语言函数的结果?

c - 为什么 GCC -Ofast 使程序出错,但仅在它打印两次结果时才出错?

python - 如何编写一个 while 循环来迭代小时数以找出咖啡因的吸收情况?

python - while 循环 "continue"在尝试内不起作用,除了,最后