前言:math.h——浮點數學的標準工具箱
math.h 提供三角、指數、對數、冪、雙曲、取整、絕對值、餘數等標準數學函數,全部基於 double 精度。本文系統整理所有函數原型、定義域/值域、錯誤處理機制 (errno, EDOM, ERANGE, HUGE_VAL)、特殊情況速查表,構建開發時的桌面速查手冊。
一、 錯誤處理統一機制
- 定義域錯誤:參數超出定義域 →
errno = EDOM,返回值實現定義。
- 值域錯誤 (溢出):結果超出
double 範圍 → 返回 HUGE_VAL,errno = ERANGE。
- 下溢:結果太小不可表示 → 返回 0,
errno 是否置 ERANGE 實現定義。
errno, EDOM, ERANGE 定義於 errno.h。
二、 三角函數 (弧度制)
| 函數 | 原型 | 定義域 | 值域 | 說明 |
| acos | double acos(double x) | [-1, 1] | [0, π] | 反余弦 |
| asin | double asin(double x) | [-1, 1] | [-π/2, π/2] | 反正弦 |
| atan | double atan(double x) | ℝ | [-π/2, π/2] | 反正切 |
| atan2 | double atan2(double y, double x) | y,x 不全為 0 | [-π, π] | 象限正確的反正切 (y/x) |
| cos | double cos(double x) | ℝ | [-1, 1] | 余弦 |
| cosh | double cosh(double x) | ℝ | [1, ∞) | 雙曲余弦 |
| sin | double sin(double x) | ℝ | [-1, 1] | 正弦 |
| sinh | double sinh(double x) | ℝ | ℝ | 雙曲正弦 |
| tan | double tan(double x) | x ≠ π/2 + kπ | ℝ | 正切 |
| tanh | double tanh(double x) | ℝ | [-1, 1] | 雙曲正切 |
三、 指數、對數、冪函數
| 函數 | 原型 | 定義域 | 值域 | 說明 |
| exp | double exp(double x) | ℝ | (0, ∞) | e^x |
| frexp | double frexp(double x, int *exp) | ℝ | [0.5, 1) 或 0 | 分解尾數/指數:x = 尾數 * 2^exp |
| ldexp | double ldexp(double x, int exp) | ℝ | ℝ | x * 2^exp (反 frexp) |
| log | double log(double x) | (0, ∞) | ℝ | 自然對數 ln(x) |
| log10 | double log10(double x) | (0, ∞) | ℝ | 常用對數 log10(x) |
| modf | double modf(double x, double *iptr) | ℝ | [0, 1) 或 (-1, 0] | 分解小數/整數部分,*iptr=整數 |
| pow | double pow(double x, double y) | 見說明 | ℝ | x^y。y∈(0,1)→x≥0;y≤0→x≠0 |
| sqrt | double sqrt(double x) | [0, ∞) | [0, ∞) | 算術平方根 |
四、 其他數學函數
| 函數 | 原型 | 定義域 | 值域 | 說明 |
| ceil | double ceil(double x) | ℝ | ℤ (≥ x) | 向上取整 |
| fabs | double fabs(double x) | ℝ | [0, ∞) | 絕對值 |
| floor | double floor(double x) | ℝ | ℤ (≤ x) | 向下取整 |
| fmod | double fmod(double x, double y) | y ≠ 0 | [-|y|, |y|] | 餘數:x - n*y (n 為截斷商) |
五、 速查卡片:常見特殊值行為
sqrt(-1) → EDOM,返回實現定義 (通常 NaN)。
log(0) → ERANGE,返回 -HUGE_VAL。
pow(0, 0) → 定義域錯誤 (實現定義,C99 規定返回 1)。
fmod(x, 0) → EDOM。
HUGE_VAL:表示 +∞ 的 double 值 (通常 DBL_MAX 或 INFINITY)。
六、 C99/C11 新增函數 (補充)
float/double/long double 重載族:sinf, sinl, expf, expl...。
fma, fmax, fmin, fdim, nan, nearbyint, round, trunc, remquo, copysign, nextafter, scalbn, ilogb, log1p, expm1, hypot, cbrt, tgamma, lgamma, erf, erfc...。
FP_FAST_FMA 等宏指示硬件加速支持。
七、 總結
math.h 函數語義清晰,核心在於**記住定義域邊界 (log/sqrt/asin/acos 參數範圍)** 與 **錯誤碼檢查模式 (調用後檢 errno)**。嵌入式/無標準庫環境可用查表法/多項式近似/牛頓迭代替代。科學計算關鍵路徑建議啟用 -ffast-math (違反 IEEE 754 但極快) 或使用 libmvec 向量化數學庫。