math.h 數學函數(需鏈接 -lm)
| 函數 | 功能 | 示例 | 注意事項 |
abs(int) | 整數絕對值 | abs(-5) → 5 | 僅限 int,長整數用 labs |
fabs(double) | 浮點數絕對值 | fabs(-3.14) → 3.14 | 返回 double |
floor(double) | 向下取整 | floor(3.7) → 3.0 | 返回 double,負數向更負方向 |
ceil(double) | 向上取整 | ceil(3.2) → 4.0 | 返回 double |
sqrt(double) | 平方根 | sqrt(9) → 3.0 | 負數輸入域錯誤,置 errno=EDOM |
pow(double, double) | 冪函數 x^y | pow(2,3) → 8.0 | 底數負、指數非整數域錯誤 |
pow10(int) | 10 的冪 | pow10(3) → 1000.0 | 非標準,GCC 擴展 |
modf(double, double*) | 分離小數/整數部分 | double ip; modf(3.14, &ip) → 0.14, ip=3.0 | 整數部分存入指針參數 |
fmod(double, double) | 浮點數餘數 | fmod(5.5, 2.0) → 1.5 | x = n*y + r,r 符號同 x |
編譯命令:gcc math_demo.c -o math_demo -lm (-lm 必須放在源文件後,否則鏈接失敗)。
stdlib.h 通用工具函數
| 函數 | 功能 | 示例/說明 |
div_t div(int, int) | 整除商餘結構體 | div_t q = div(7,3); q.quot=2, q.rem=1 |
ldiv_t ldiv(long, long) | 長整數版 div | 同 div,類型為 long |
rand() | 偽隨機數 [0, RAND_MAX] | 需配合 srand(seed) 初始化 |
srand(unsigned) | 設置隨機種子 | 常用 srand(time(NULL)) |
malloc/calloc/realloc/free | 動態內存管理 | 核心四件套,務必配對 |
exit(int) | 正常終止程序 | 調用 atexit 註冊函數,刷新流 |
atexit(void(*)()) | 註冊退出處理函數 | 後進先出調用,最多 32 個 |
qsort(void*, size_t, size_t, cmp) | 快速排序 | 比較函數 int cmp(const void*, const void*) |
bsearch(const void*, void*, size_t, size_t, cmp) | 二分查找 | 前提:數組已按 cmp 排序 |
隨機數最佳實踐
#include
#include
void init_random() {
srand((unsigned)time(NULL)); // 程序啟動時調用一次
}
int random_range(int min, int max) { // [min, max]
return min + rand() / (RAND_MAX / (max - min + 1) + 1);
}
// 注意:rand() 質量一般,加密/科學計算請用 /dev/urandom 或 C++11
常見坑點
- 忘記 -lm:
undefined reference to `floor' 等鏈接錯誤。
- abs(-2147483648) 溢出:
INT_MIN 絕對值超出 int 範圍,行為未定義。用 long long 或自寫 safe_abs。
- rand() 線程不安全:多線程用
rand_r(&seed) 或線程局部種子。
qsort/bsearch 比較函數簽名:必須為 int (*)(const void*, const void*),轉型錯誤極難排查。