gpt4 book ai didi

c - C 中的 double 等于 0 问题

转载 作者:太空狗 更新时间:2023-10-29 16:53:36 25 4
gpt4 key购买 nike

我正在实现一种算法来计算 C 中的自然对数。

double taylor_ln(int z) {
double sum = 0.0;
double tmp = 1.0;

int i = 1;
while(tmp != 0.0) {
tmp = (1.0 / i) * (pow(((z - 1.0) / (z + 1.0)), i));
printf("(1.0 / %d) * (pow(((%d - 1.0) / (%d + 1.0)), %d)) = %f\n", i, z, z, i, tmp);
sum += tmp;
i += 2;
}

return sum * 2;
}

如 print 语句所示,tmp 最终确实等于 0.0,但是循环继续。可能是什么原因造成的?

我在 Fedora 14 amd64 上编译:

clang -lm -o taylor_ln taylor_ln.c

例子:

$ ./taylor_ln 2
(1.0 / 1) * (pow(((2 - 1.0) / (2 + 1.0)), 1)) = 0.333333
(1.0 / 3) * (pow(((2 - 1.0) / (2 + 1.0)), 3)) = 0.012346
(1.0 / 5) * (pow(((2 - 1.0) / (2 + 1.0)), 5)) = 0.000823
(1.0 / 7) * (pow(((2 - 1.0) / (2 + 1.0)), 7)) = 0.000065
(1.0 / 9) * (pow(((2 - 1.0) / (2 + 1.0)), 9)) = 0.000006
(1.0 / 11) * (pow(((2 - 1.0) / (2 + 1.0)), 11)) = 0.000001
(1.0 / 13) * (pow(((2 - 1.0) / (2 + 1.0)), 13)) = 0.000000
(1.0 / 15) * (pow(((2 - 1.0) / (2 + 1.0)), 15)) = 0.000000
(1.0 / 17) * (pow(((2 - 1.0) / (2 + 1.0)), 17)) = 0.000000
(1.0 / 19) * (pow(((2 - 1.0) / (2 + 1.0)), 19)) = 0.000000
(1.0 / 21) * (pow(((2 - 1.0) / (2 + 1.0)), 21)) = 0.000000
and so on...

最佳答案

浮点比较是精确的,所以 10^-100.0 不同。

基本上,您应该比较一些可容忍的差异,比如 10^-7 基于您写出的小数位数,这可以通过以下方式完成:

while(fabs(tmp) > 10e-7)

关于c - C 中的 double 等于 0 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858531/

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