使用 GCC 編譯時必須連結數學庫:
gcc -o prog prog.c -lm
標頭檔:`#include <math.h>`
| 分類 | 函數 |
|---|---|
| 絕對值 | abs, labs, fabs |
| 三角函數 | sin, cos, tan, asin, acos, atan, atan2 |
| 雙曲函數 | sinh, cosh, tanh |
| 指數/對數 | exp, log, log10, pow, sqrt |
| 取整/分解 | ceil, floor, frexp, ldexp, modf |
| 其他 | hypot, fmod |
int abs(int j); // 整數
long labs(long j); // 長整數
double fabs(double x); // 浮點數
double sin(double x); // 正弦 [-1,1]
double cos(double x); // 餘弦 [-1,1]
double tan(double x); // 正切
double asin(double x); // 反正弦 [-π/2, π/2], 定義域 [-1,1]
double acos(double x); // 反餘弦 [0, π], 定義域 [-1,1]
double atan(double x); // 反正切 [-π/2, π/2]
double atan2(double y, double x); // 反正切 y/x [-π, π], 可判斷象限
錯誤碼:`EDOM` 參數超出定義域;`ERANGE` 結果溢位。
double sinh(double x); // (e^x - e^-x)/2
double cosh(double x); // (e^x + e^-x)/2
double tanh(double x); // sinh/cosh
double exp(double x); // e^x
double log(double x); // ln(x), x>0
double log10(double x); // log10(x), x>0
double pow(double x, double y); // x^y
double sqrt(double x); // √x, x≥0
錯誤碼:`EDOM` 定義域錯誤(如 log(負數));`ERANGE` 溢位(如 log(0))。
double ceil(double x); // 向上取整 ≥x 最小整數
double floor(double x); // 向下取整 ≤x 最大整數
double frexp(double x, int *exp); // x = 尾數 × 2^exp, 尾數∈[0.5,1)
double ldexp(double x, int exp); // x × 2^exp
double modf(double x, double *iptr); // 分離整數/小數部分
#include <stdio.h>
#include <math.h>
int main() {
double x = 0.5, y = 2.0;
printf("sin(0.5) = %f\n", sin(x));
printf("cos(0.5) = %f\n", cos(x));
printf("tan(0.5) = %f\n", tan(x));
printf("asin(0.5) = %f rad = %f deg\n", asin(x), asin(x)*180/M_PI);
printf("sqrt(200) = %f\n", sqrt(200));
printf("exp(10) = %f\n", exp(10));
printf("log(100) = %f\n", log(100));
printf("log10(100) = %f\n", log10(100));
printf("pow(2,10) = %f\n", pow(2,10));
printf("sinh(0.5) = %f\n", sinh(x));
printf("cosh(0.5) = %f\n", cosh(x));
printf("tanh(0.5) = %f\n", tanh(x));
printf("ceil(1.12) = %f\n", ceil(1.12));
printf("floor(1.12) = %f\n", floor(1.12));
int exp;
double frac = frexp(1024, &exp);
printf("frexp(1024) = %f * 2^%d\n", frac, exp);
printf("ldexp(3,2) = %f\n", ldexp(3,2));
double intpart;
double fracpart = modf(3.14, &intpart);
printf("modf(3.14) = 整數:%f 小數:%f\n", intpart, fracpart);
return 0;
}
`math.h` 提供豐富的數學運算支援。關鍵在於:記得 `-lm` 連結、理解弧度制、檢查定義域錯誤、善用誤差處理機制。嵌入式開發可考慮定點數或查表法替代部分浮點運算。