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 函數近似公式如下:
以下是對應的 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 函數的基本用法、應用範例以及如何自行實作。掌握三角函數的運用,可以應用於物理模擬、聲音處理等多個領域。透過馬克勞林展開的實作方式,也能更深入理解函數的運算原理。希望這些內容能對讀者的專案有所幫助。