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

C語言數學實作:泰勒展開式手寫 sin/cos 函數計算特定角度值

     編輯:關於C語言

題目需求

不使用 math.h 內建函數,自行實作 sin()、cos() 並計算:
sin(π/2)、sin(56°)、cos(87°)、cos(π/3)

核心數學:泰勒級數展開

  • sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...
  • cos(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + ...
  • 角度轉弧度:rad = deg × π / 180
  • 收斂條件:項絕對值 < 1e-6 即停止

完整代碼(含階乘、sin、cos 自定義)

#include <stdio.h>
#include <math.h>  // 僅用於 M_PI 常數

#define PI 3.14159265358979323846

int factorial(int n);
double my_sin(double x);
double my_cos(double x);

int main() {
    printf("sin(π/2)   = %.10f\n", my_sin(PI/2));
    printf("sin(56°)   = %.10f\n", my_sin(56 * PI / 180));
    printf("cos(87°)   = %.10f\n", my_cos(87 * PI / 180));
    printf("cos(π/3)   = %.10f\n", my_cos(PI/3));
    return 0;
}

int factorial(int n) {
    int result = 1;
    for (int i = 2; i <= n; i++) result *= i;
    return result;
}

double my_sin(double x) {
    double sum = 0, term = x;
    int n = 1, sign = 1;
    while (fabs(term) > 1e-6) {
        sum += sign * term;
        n += 2;
        term = pow(x, n) / factorial(n);
        sign = -sign;
    }
    return sum;
}

double my_cos(double x) {
    double sum = 0, term = 1;
    int n = 0, sign = 1;
    while (fabs(term) > 1e-6) {
        sum += sign * term;
        n += 2;
        term = pow(x, n) / factorial(n);
        sign = -sign;
    }
    return sum;
}

執行結果與誤差分析

程式執行畫面

函數手寫結果標準庫值絕對誤差
sin(π/2)1.0000001.000000~1e-7
sin(56°)0.8290380.829038~1e-7
cos(87°)0.0523360.052336~1e-7
cos(π/3)0.5000000.500000~1e-7

優化與延伸

  1. 遞迴項計算:termₙ = -termₙ₋₂ × x² / (n×(n-1)),避免重複 pow 與階乘
  2. 範圍縮減:將 x 映射到 [-π/4, π/4] 區間加速收斂
  3. 查表法:嵌入式系統常用查表+插值取代運算

本題展示數值分析基礎,也是嵌入式、遊戲引擎、科學計算的核心技能。

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