C 語言 sin 函數完整教學:基礎原理、應用範例與自行實作方法

1. C 語言中的 sin 函數基礎

在 C 語言中,透過使用標準函式庫「math.h」即可進行三角函數的計算。其中,sin 函數用於計算角度的正弦值。本文將詳細介紹在 C 語言中使用 sin 函數的方法、其應用,以及自行實作 sin 函數的方式。

1.1 什麼是 sin 函數?

sin 函數以弧度(radian)作為輸入,回傳該角度的正弦值。弧度是一種以圓周率 π 為基準的角度單位,若要與常用的角度(degree)互換,則需要進行單位轉換。

2. C 語言中 math.h 函式庫的基礎

要使用三角函數,需先 #include <math.h>。這樣便可使用 sin 函數及其他數學函數。

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

int main() {
    double angle = 1.57; // 相當於 90 度的弧度
    double result = sin(angle);
    printf("sin(1.57) = %f\n", result);
    return 0;
}

此程式會輸出 90 度(弧度 1.57)的正弦值為 1.000000。

2.1 角度與弧度的轉換

將角度轉換為弧度可使用以下公式:

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.141592653589793)

int main(void) {
    double deg = 90.0;
    double rad = DEG_TO_RAD(deg);
    printf("sin(%f 度) = %f\n", deg, sin(rad));
    return 0;
}

此程式會將 90 度轉換為弧度,並使用該值計算 sin 函數。

3. 應用範例:產生正弦波

正弦波在語音合成與訊號處理中是常見的波形。以下程式會產生正弦波並輸出每個取樣值:

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

int main() {
    int samples = 100;
    double frequency = 1.0;
    double amplitude = 1.0;
    double phase = 0.0;
    double sampleRate = 100.0;

    for (int i = 0; i < samples; i++) {
        double t = i / sampleRate;
        double value = amplitude * sin(2 * M_PI * frequency * t + phase);
        printf("樣本 %d: %f\n", i, value);
    }
    return 0;
}

此程式會依照設定的頻率與取樣率產生正弦波,並可將輸出資料用於語音或其他訊號處理應用。

4. 自行實作 sin 函數:馬克勞林展開

在某些環境下,可能無法使用標準函式庫,或需要進行特殊優化,此時可以自行實作 sin 函數。馬克勞林展開是一種利用多項式近似 sin 函數的方法。

4.1 使用馬克勞林展開的 sin 函數

馬克勞林展開的 sin 函數近似公式如下:

 \sin(x) = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots

以下是對應的 C 語言實作:

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

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

double my_sin(double x) {
    double result = 0.0;
    for (int i = 0; i < 10; i++) {  // 計算前 10 項
        int power = 2 * i + 1;
        double term = pow(x, power) / factorial(power);
        if (i % 2 == 0) {
            result += term;
        } else {
            result -= term;
        }
    }
    return result;
}

int main() {
    double angle = 1.57;
    printf("sin(1.57) = %f\n", my_sin(angle));
    return 0;
}

此程式使用馬克勞林展開計算 sin 值,精度取決於計算的項數,一般 10 項即可達到良好準確度。

5. 錯誤與注意事項

使用浮點數計算時,在處理極小或極大的數值時可能會出現精度問題。特別是在自行實作 sin 函數時,計算項數越多,計算成本也越高。此外,馬克勞林展開在計算絕對值大於 ±π 的角度時精度會下降,因此建議先將角度正規化至適當範圍再計算。

6. 總結

本文介紹了 C 語言中 sin 函數的基本用法、應用範例以及如何自行實作。掌握三角函數的運用,可以應用於物理模擬、聲音處理等多個領域。透過馬克勞林展開的實作方式,也能更深入理解函數的運算原理。希望這些內容能對讀者的專案有所幫助。