gpt4 book ai didi

c++ - 此函数是否以 3 位的精确精度计算数字的自然对数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:23 26 4
gpt4 key购买 nike

我的教科书中有以下算法,它应该以 3 位的精确精度计算数字的自然对数。

#include <iostream>
#include <cmath>

double logN(double a, double li, double ls)
{
if(a == 1)
return 0;
else if(fabs(li - ls) < 0.0001)

return (li + ls) / 2;
else if((exp(li) - a) * (exp((li + ls) / 2) - a) < 0)
return logN(a, li, (li + ls) / 2);
else
return logN(a, (li + ls) / 2, ls);
}

int main()
{
std::cout << logN(3, 0, 3) << std::endl;
std::cout << logN(4, 0, 4) << std::endl;
std::cout << logN(5, 0, 5) << std::endl;

return 0;
}

这个陈述在我看来是错误的:

else if(fabs(li - ls) < 0.0001)

例如,如果我有 2 个数字:0.99920.9996。两个数字的前 3 位数字相等,但它们之间的差值是 0.0004,大于 0.0001,因此测试将失败。我错过了什么?

最佳答案

这是为了 (li + ls)/2 正常工作所必需的。

例如:

0.999 - 0.9981 = 0.0009 < 0.001

但是:

(0.999 + 0.9981) / 2 = 0.99855

另一方面:

(0.9999 + 0.9998) / 2 = 0.99985

舍入到第 3 位时,舍入为 1。

关于c++ - 此函数是否以 3 位的精确精度计算数字的自然对数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397872/

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