loge(a)取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;
}
最佳答案
如果只想计算数字的自然对数,则可以使用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/