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

C語言計算正弦函數:調用庫函數sin()與泰勒級數展開自實現

     編輯:C 語言問答

方法一:標準庫 sin()(工程首選)


#include 
#include    // 必須包含

int main(void) {
    double angle_deg = 30.0;
    double angle_rad = angle_deg * M_PI / 180.0; // 角度轉弧度
    double result = sin(angle_rad);
    printf("sin(30°) = %.6f\n", result); // 0.500000
    return 0;
}

編譯鏈接:GCC/Clang 需顯式鏈接數學庫 -lm:gcc sin_demo.c -o sin_demo -lm。MSVC 自動鏈接。

方法二:泰勒級數手動實現(教學/無庫環境)

公式:sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ... (x 為弧度)


#include 
#include 

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

    double term = x;   // 第 1 項 x
    double sum = term;
    int n = 1;
    do {
        n += 2;                    // 3, 5, 7...
        term *= -x * x / (n * (n-1)); // 遞推公式:termₙ = -termₙ₋₂ * x² / (n*(n-1))
        sum += term;
    } while (fabs(term) > 1e-12); // 精度控制
    return sum;
}

int main(void) {
    for (int deg = 0; deg <= 360; deg += 30) {
        double rad = deg * M_PI / 180.0;
        printf("sin(%3d°) = %.8f (lib=%.8f)\n", deg, my_sin(rad), sin(rad));
    }
    return 0;
}

關鍵優化點

  • 範圍縮減:大角度直接展開收斂極慢且精度差,必須映射到 [-π, π]。
  • 遞推計算:利用 termₙ = -termₙ₋₂ * x² / (n*(n-1)) 避免重複計算階乘與冪,防止溢出。
  • 精度判斷:項絕對值小於閾值 (如 1e-12) 終止。

對比總結

方案精度速度適用場景
sin()全精度 (通常 1 ULP)極快 (硬件指令/查表+多項式)所有生產代碼
泰勒級數可控 (項數/閾值)慢 (軟件循環)教學、無標準庫環境、特殊精度需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved