【问题标题】:Does this function compute the natural logarithm of a number with an exact precision of 3 digits?此函数是否计算精确到 3 位精度的数字的自然对数?
【发布时间】:2015-05-22 13:23:23
【问题描述】:

我的教科书中有以下算法,它应该计算一个精确到 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,因此测试将失败。我错过了什么?

【问题讨论】:

  • 参数alils是什么意思?
  • x 位的精度并不一定意味着前 x 位是相同的。例如 0.999999999 在 1.000000 精度的 3 位以内,但前 3 位并不相同
  • @NayukiMinase a 是我正在计算其日志的数字,lils 是解决方案所在区间 (0, a) 的边界。我知道,代码不是自我描述的,但我不想改变教科书中的原始源代码。顺便说一句,如果有帮助,这是二分法。

标签: c++ algorithm floating-point logarithm


【解决方案1】:

这是(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

四舍五入为 1,舍入为第 3 位。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2015-07-29
    • 2017-03-29
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2013-10-02
    • 2019-08-15
    相关资源
    最近更新 更多