【发布时间】:2019-08-31 06:22:58
【问题描述】:
我尝试使用泰勒展开式制作一个函数输出,该函数输出近似于 x 的对数值(x 是一个浮点数)。
自然对数的泰勒级数:
ln(x) = {n=0 (sigma) inf} (-1)^n*(x-1)^(n+1)/(n+1)
(使用 sigma 求和)以获得更清晰的泰勒展开图像,请参阅 https://en.wikipedia.org/wiki/Taylor_series#First_example
此外:log(a,b)=log(a)/log(b)(a 是底数)
以下是我使用这些原则的实现:
double logtaylor(double a,double b,double prec)
{
double suma=0,sumb=0,n;
for(n=0;n<prec+1;++n)
{
suma+=(pow(-1,n)*pow(a-1,n+1)/(n+1));
sumb+=(pow(-1,n)*pow(b-1,n+1)/(n+1));
printf("%d)suma=%lf\n",(int)n,suma);
printf("%d)sumb=%lf\n",(int)n,sumb);
}
return suma/sumb;
}
我正在测试以 3 为底的对数 2 -logtaylor(2,3,30)- 精度为 30。
输出:
math.h: 0.630930
0)suma=1.000000
0)sumb=2.000000
1)suma=0.500000
1)sumb=0.000000
2)suma=0.833333
...
26)suma=0.711323
26)sumb=3272620.000449
27)suma=0.675609
27)sumb=-6314360.570980
28)suma=0.710091
28)sumb=12198429.497986
29)suma=0.676758
29)sumb=-23592964.635348
30)suma=0.709016
30)sumb=45680701.429168
除了变量之外,求和 a 和 b 的两个语句完全相同,但是它们的行为完全不同。suma 非常接近数学标题中计算的真实值。我也使用 calc 确认(log(2, 3)~0.63092975356)- 而它的对应物正在大幅偏离,攀升至数百万。我无法绕开它。我很感激任何帮助。提前致谢。
【问题讨论】:
标签: c logarithm math.h taylor-series