我需要大约(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/

10-15 00:25