首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

數學庫函數底層實現原理:泰勒級數展開計算 Sin/Cos 函數的 C++ 實現與精度控制

     編輯:程式設計疑難解答

泰勒級數公式

sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...
cos(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + ...

x 為弧度。收斂速度極快,雙精度下約 10-15 項即達機器精度。

C++ 實現

const double PI = 3.14159265358979323846;

double mySin(double deg) {
    double rad = deg * PI / 180.0;
    double term = rad, sum = rad;
    for (int n = 3; ; n += 2) {
        term *= -rad * rad / (n * (n-1)); // 遞推公式:term_n = -term_{n-2} * x² / (n*(n-1))
        sum += term;
        if (fabs(term) < 1e-12) break; // 精度閾值
    }
    return sum;
}

double myCos(double deg) {
    double rad = deg * PI / 180.0;
    double term = 1.0, sum = 1.0;
    for (int n = 2; ; n += 2) {
        term *= -rad * rad / (n * (n-1));
        sum += term;
        if (fabs(term) < 1e-12) break;
    }
    return sum;
}

關鍵優化

  1. 遞推計算項:避免重複 pow 和階乘,利用 term_n = -term_{n-2} * x² / (n*(n-1))。
  2. 角度歸一化:大角度先 fmod(rad, 2*PI) 減少項數。
  3. 精度控制:項絕對值小於 1e-12 終止,雙精度約 15-16 位有效數字。

運行對比

輸入 30 度:
mySin = 0.5000000000000001
std::sin = 0.5
誤差 ~ 1e-16

工業級庫實現

  • glibc、MSVC CRT 使用 多項式逼近(Minimax/Remez 算法)而非泰勒展開,在特定區間內誤差均勻分布,速度更快。
  • 硬件指令:x86 FSIN/FCOS、ARM VFP/NEON 向量化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved