首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言數學庫實踐:泰勒級數手寫sin/cos函式實現

     編輯:關於C語言

數學原理

正弦與餘弦函數可通過泰勒級數展開計算:

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

其中 x 為弧度制。程式中將輸入角度轉換:rad = deg * PI / 180。

原始代碼分析與優化

1. 階乘函式遞歸實現

int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

缺陷:int 型別 13! 即溢位(>2¹⁷),且遞歸開銷大。建議改用迭代並預計算或使用 double 累乘。

2. 級數求和終止條件

原代碼使用 pow(x,i)/factorial(i) > 1e-7 作為迴圈條件,存在效能問題:

  • 每次迴圈重複計算冪與階乘,時間複雜度 O(n²)。
  • 大 x 時項數增多,階乘快速溢位。

3. 優化策略:遞推公式

利用項與前項關係:

// sin: term_k = -term_{k-1} * x² / ((2k)*(2k-1))
// cos: term_k = -term_{k-1} * x² / ((2k-1)*(2k-2))

單次迴圈累加,避免重複計算,複雜度降為 O(n)。

高效實現版本

#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846
#define EPS 1e-12

double my_sin(double x) {
    // 區間縮減:利用週期性將 x 映射到 [-π, π]
    x = fmod(x, 2*PI);
    if (x < -PI) x += 2*PI;
    else if (x > PI) x -= 2*PI;

    double term = x, sum = x;
    int n = 1;
    while (fabs(term) > EPS) {
        term *= -x*x / ((2*n)*(2*n+1));
        sum += term;
        n++;
    }
    return sum;
}

double my_cos(double x) {
    x = fmod(x, 2*PI);
    if (x < -PI) x += 2*PI;
    else if (x > PI) x -= 2*PI;

    double term = 1.0, sum = 1.0;
    int n = 1;
    while (fabs(term) > EPS) {
        term *= -x*x / ((2*n-1)*(2*n));
        sum += term;
        n++;
    }
    return sum;
}

int main() {
    double deg;
    printf("Enter angle in degrees: ");
    if (scanf("%lf", °) != 1) return 1;

    double rad = deg * PI / 180.0;
    printf("sin(%.2f°) = %.10f (lib: %.10f)\n", deg, my_sin(rad), sin(rad));
    printf("cos(%.2f°) = %.10f (lib: %.10f)\n", deg, my_cos(rad), cos(rad));
    return 0;
}

關鍵技術點總結

  1. 區間縮減:大角度直接展開收斂極慢,必須利用三角函數週期性縮減定義域。
  2. 遞推計算:單次乘除替代冪與階乘,大幅提升效能並避免溢位。
  3. 精度控制:使用 fabs(term) > EPS 判斷項值貢獻,而非固定項數。
  4. 對比驗證:輸出與標準庫 sin/cos 對比,確保正確性。

擴展應用場景

  • 嵌入式系統無 FPU 時定點數實現三角函數。
  • 教學演示數值分析中級數收斂性質與誤差傳播。
  • 結合 atan2 實現完整三角函數庫(tan, asin, acos 等)。

sin/cos 程式執行結果對比圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved