美文网首页
比尔盖茨汇编实现泰勒级数

比尔盖茨汇编实现泰勒级数

作者: 杰_6343 | 来源:发表于2021-12-17 09:27 被阅读0次

    泰勒级数-比尔盖茨汇编实现的以泰勒公式计算逼近正弦sin函数的方法

    编程珠玑

    发现越往后,越精确,但是代价就是计算量越大。而往往我们直接舍去后面的高阶无穷小,仅需要前三四项即可满足我们的要求。

    具体步骤为:

    1),先让函数值相同,也即 得到:  2),再让一阶导数相等

    得到: ......

    最后让n阶导数数相等 (  的  阶导数仍是  )

    得到: 最后得出:

    当  不断增大的时候,小明惊奇地发现在固定区间内,两者几乎完美地融合在了一起

    泰勒级数的几何意义

    三个面积相加,也就是

    上面这个式子不正是泰勒级数展开的二次多项式

    当无限逼近  ,那么我们完全可以用  来近似  ,也就是说省略掉后面的矩形与三角形,只剩下一项。而实际上我们省略了后面的高阶无穷小,在一般情况下,精度已经够高了。

    这便是泰勒级数在几何上面的解释。

    通过C语言翻译实现

    #include <math.h>
    // 多项式求值,c[0] + c[1] * x + c[2] * x^2 + ... + c[n-1] * x^(n-1)
    float poly(float x, int n, const float* c) {
        float sum = 0;
        for(int i = 0; i < n; ++i) {
            sum *= x;
            sum += c[i];
        }
        return sum;
    }
    // 多项式求值,c[0] * x + c[1] * x^3 + c[2] * x^5 + ... + c[n-1] * x^(2n-1)
    float polyx(float x, int n, const float* c) { return poly(x * x, n, c) * x; }
    // 泰勒展开的系数,(2PI)^n / n! (n = 9, 7, 5, 3, 1)
    const float SIN_TABLE[] = {39.710899, -76.574956, 81.602231, -41.341677, 6.2831853};
    float basic_sin(float x) {
        // 应用三角函数的周期性,变换输入 [0, 2PI) / [0, 1)
        x /= 3.1415926 * 2;
        x -= floor(x);
        // 将输入进一步变换到 [-PI/2, PI/2] / [-1/4, 1/4]
        x = 0.25 - x;
        int sign = x <= 0;
        if(sign) {
            // 第二、三、四象限
            x += 0.5;
            if(x > 0) {
                // 第二、三象限
                x = -x;
            }
        } else {
            // 第一象限
            x = -x;
        }
        x += 0.25;
        if(sign) x = -x;
        // 这一步完成之后:
        // 第一象限 [0, 1/4) -> [0, 1/4):x -> x
        // 第二象限 [1/4, 2/4) -> (0, 1/4]:x -> 0.5 - x
        // 第三象限 [2/4, 3/4) -> (-1/4, 0]:x -> 0.5 - x
        // 第四象限 [3/4, 1) -> [-1/4, 0):x -> x - 1
        // 然后就是泰勒展开
        return polyx(x, 5, SIN_TABLE);
    }

    相关文章

      网友评论

          本文标题:比尔盖茨汇编实现泰勒级数

          本文链接:https://www.haomeiwen.com/subject/vmzbfrtx.html