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

时间:2014-08-21 14:45:54

标签: c++ logarithm natural-logarithm

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

在函数中,x = a / 3。 y = x-1 + a * exp(-x)。我将继续相互减去它们(得到绝对差值)并继续直到差值小于0.000001。我的朋友告诉我,我做的是正确的,但是当我尝试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;
}

1 个答案:

答案 0 :(得分:2)

如果您只想计算数字的自然对数,可以使用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