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) | 極快 (硬件指令/查表+多項式) | 所有生產代碼 |
| 泰勒級數 | 可控 (項數/閾值) | 慢 (軟件循環) | 教學、無標準庫環境、特殊精度需求 |