gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:20 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com