c++ - 试图找到数字的 ln 或自然对数

标签 c++ logarithm natural-logarithm

loge(a) 取一个非零正实数 a。

在函数中,x = a/3。 y = x-1+a*exp(-x)。我将继续将它们彼此相减(得到绝对差值)并一直持续到差值小于 0.000001。我的 friend 告诉我我所做的是正确的,但是当我尝试 loge(2) 时,我得到了 0.678(一些东西)。任何更高的值都会导致它出现段错误。有小费吗?谢谢。

#include <iostream>

using namespace std;

long double power(long double a, long int b);
long double power(long double a, long int b)
{
    if (b == 0)
    {
        return 1;
    }
    else if (b == 1)
    {
        return a;
    }
    else if (b < 0)
    {
        return 1.0/power(a, -b);
    }
    else if (b%2==0)
    {
        return power(a*a, b/2);
    }
    else if (b%2!=0)
    {
        return a*power(a*a, b/2);
    }

}


long double exp(long double x);
long double exp(long double x)
{
    if (x < 0.000001)
    {
        return 1+x+(power(x, 2)/2)+(power(x, 3)/6);
    }
    else
    {
        return power(exp(x/10), 10);
    }
}


long double loge(long double a);
long double loge(long double a)
{
    long double x, y, lim = 0.000001;
    if (a == 1)
    {
        return 0;
    }
    else
    {
        x = a/3;
        y = x-1+a*exp(-x);
        while (x*lim != y*lim)
        {
            x = y;
            y = x-1+a*exp(-x);
        }
        return y;
    }
}

int main()
{
    long double num;
    cout << "Enter a number: ";
    cin >> num;
    cout << loge(num);
    cout << "\n";
    return 0;
}

最佳答案

如果你只想计算一个数的自然对数,你可以使用 std::log .要计算任何底数的对数,您可以编写如下函数:

double log(double base, double x) {
  return std::log(x)/std::log(base);
}

您需要添加代码来检查有效输入(例如,base 不能等于 1 或小于 0)。

如果你想在没有 std::log 的情况下实现自然对数​​,你可能想看看 std::numeric_limits为您的差异限制而不是将其硬编码为 lim = 0.000001

关于c++ - 试图找到数字的 ln 或自然对数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25429373/

相关文章:

c++ - 获取“运行时检查失败 #0 ;当调用 obj -> X(); 其他一些甚至不是 solutn 的一部分的函数 Y() 被调用

c# - 获取过去一年的 Facebook 数据?

algorithm - 对数的复杂性分析

java - 使用对数

optimization - 如何加快我的近似自然对数函数?

c++ - 为什么编译器推迟 std::list 释放?

c++ - OggVorbis ov_open() 抛出访问冲突异常

python - matplotlib.pyplot 未正确设置散点图对数轴的范围

连分数自然对数(计算右对数所需的迭代次数)

sse - SSE的对数,还是切换到FPU?