我需要大约(1-x)^0.25和给定的精度(例如0.0001)。我用expansion found on Wikipedia表示(1+x)^0.25。当当前表达式小于精度时,我需要停止近似。
long double s(long double x, long double d) {
long double w = 1;
long double n = 1; // nth expression in series
long double tmp = 1;
// sum while last expression is greater than accuracy
while (fabsl(tmp) >= d) {
tmp *= (1.25 / n - 1) * (-x); // the next expression
w += tmp; // is added to approximation
n++;
}
return w;
}
不要介意long double n.:P当我不是在检查当前表达式的值,而是在计算1000个或更多表达式时,这很有效。函数的域是中计算X的逼近良好。参数越大,计算误差就越大。从0.6开始,它超过了精度。
我不确定问题是否足够清楚,因为我不太懂英语数学语言。事情是什么,而条件是什么,为什么函数S.()不正确近似。
编辑:
问题基本解决了。当x>0时,我必须从1减去连续表达式的绝对值。
if (x<0)
w += tmp;
else
w -= fabsl(tmp);
在那之后,精确度增加了很多(当然,fox x>0)。冗余误差源于长时间的双精度误差。这就是全部。无论如何谢谢你们。
最佳答案
尝试绘制函数abs((1.0+x)α-二项式(α,x,公差))的图形,即使在接近x的范围内,例如[-0.5;0.5],也会得到如下结果:
这意味着二项式展开实现不稳定。当x离零级数越来越远时,必须包含越来越多的给定精度的项。但是在当前的扩展实现中这样做会导致Catastrophic cancellation的发生(一些浮点错误累积机制)。试着阅读我给出的关于如何设计数值稳定算法的链接。
顺便说一句,谢谢你的问题真的很有趣!
关于c - Maclaurin系列的功能逼近,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5333295/