首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C 數學函數庫完整參考手冊:math.h 全函數詳解

     編輯:關於C語言

編譯須知

使用 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

核心函數詳細說明

1. 絕對值

int abs(int j);           // 整數
long labs(long j);        // 長整數
double fabs(double x);    // 浮點數

2. 三角函數(弧度制)


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` 結果溢位。

3. 雙曲函數


double sinh(double x);    // (e^x - e^-x)/2
double cosh(double x);    // (e^x + e^-x)/2
double tanh(double x);    // sinh/cosh

4. 指數與對數


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))。

5. 取整與分解


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;
}

常見陷阱與最佳實踐

  1. 角度制轉換:所有三角函數使用弧度。度數轉弧度:`rad = deg * M_PI / 180`
  2. 定義域檢查:呼叫 `asin`/`acos`/`sqrt`/`log` 前驗證參數範圍
  3. 錯誤處理:檢查 `errno`(需 `#include <errno.h>`)或使用 `math_errhandling`
  4. 精度考量:`float` 版本函數(`sinf`、`cosf` 等)在嵌入式系統較快
  5. 特殊值:`INFINITY`、`NAN`、`HUGE_VAL` 處理溢位/無效運算

C99/C11 新增函數(節選)

  • `round`, `trunc`, `rint`, `nearbyint`:多種取整模式
  • `fma`:融合乘加 `x*y+z`(單次捨入)
  • `hypot`:計算 `√(x²+y²)` 避免中間溢位
  • `cbrt`:立方根
  • `expm1`, `log1p`:高精度 `e^x-1`, `ln(1+x)`

總結

`math.h` 提供豐富的數學運算支援。關鍵在於:記得 `-lm` 連結、理解弧度制、檢查定義域錯誤、善用誤差處理機制。嵌入式開發可考慮定點數或查表法替代部分浮點運算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved