国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > math.h 以获得更好的体验。

# C 语言标准库头文件 math.h

请查看 C 语言标准库头文件列表 了解更多相关 API。

这个头文件提供 数学 的相关功能,例如计算指数,对数,三角函数以及近似取整等。

需要链接数学库,例如在 gcc 中需要添加 -lm 链接选项。

# 示例

#include <stdio.h>
#include <math.h>   // 包含数学函数声明
#include <float.h>  // 用于获取浮点数特性

int main(void) {
    // 1. 基本数学运算
    printf("sqrt(16.0) = %.2f\n", sqrt(16.0));      // 平方根
    printf("pow(2, 5) = %.2f\n", pow(2, 5));        // 幂运算
    printf("fabs(-3.14) = %.2f\n", fabs(-3.14));    // 绝对值
    
    // 2. 三角函数(使用弧度制)
    double angle = 45.0 * M_PI / 180.0;  // 将45度转换为弧度
    printf("sin(45°) = %.4f\n", sin(angle));
    printf("cos(45°) = %.4f\n", cos(angle));
    printf("tan(45°) = %.4f\n", tan(angle));
    
    // 3. 指数和对数函数
    printf("exp(1.0) = %.4f (e^1)\n", exp(1.0));
    printf("log(10.0) = %.4f (自然对数)\n", log(10.0));
    printf("log10(100.0) = %.4f (常用对数)\n", log10(100.0));
    
    // 4. 取整函数
    printf("ceil(3.2) = %.2f\n", ceil(3.2));    // 向上取整
    printf("floor(3.8) = %.2f\n", floor(3.8));  // 向下取整
    printf("round(3.5) = %.2f\n", round(3.5));  // 四舍五入
    
    // 5. 其他常用函数
    printf("fmod(10.3, 3.0) = %.2f (浮点余数)\n", fmod(10.3, 3.0));
    printf("hypot(3, 4) = %.2f (直角三角形斜边)\n", hypot(3, 4));
    
    // 6. 数学常量
    printf("M_PI = %.10f (圆周率π)\n", M_PI);
    printf("M_E = %.10f (自然对数底数e)\n", M_E);
    
    return 0;
}

运行结果:

user@host:~ $ gcc main.c -lm
user@host:~ $ ./a.out
sqrt(16.0) = 4.00
pow(2, 5) = 32.00
fabs(-3.14) = 3.14
sin(45°) = 0.7071
cos(45°) = 0.7071
tan(45°) = 1.0000
exp(1.0) = 2.7183 (e^1)
log(10.0) = 2.3026 (自然对数)
log10(100.0) = 2.0000 (常用对数)
ceil(3.2) = 4.00
floor(3.8) = 3.00
round(3.5) = 4.00
fmod(10.3, 3.0) = 1.30 (浮点余数)
hypot(3, 4) = 5.00 (直角三角形斜边)
M_PI = 3.1415926536 (圆周率π)
M_E = 2.7182818285 (自然对数底数e)

# 类型

类型 标准 说明
float_t C99 至少和 float 宽度一样的,最高效的单精度浮点类型
double_t C99 至少和 double 宽度一样的,最高效的双精度浮点类型

# 常量

常量 标准 说明
HUGE_VALF C99 表示数值太大而无法被 float 表示
HUGE_VAL C89 表示数值太大而无法被 double 表示
HUGE_VALL C99 表示数值太大而无法被 long double 表示
INFINITY C99 表示正无穷大,注意两个 INFINITY 之间可能不相等,应当使用 isinf 判断
NAN C99 表示不是一个数值(Not A Number),注意两个 NAN 之间永远不相等,应当使用 isnan 判断
FP_FAST_FMAF C99 指示是否支持 float 类型的快速乘加操作,即 fmaf 函数
FP_FAST_FMA C99 指示是否支持 double 类型的快速乘加操作,即 fma 函数
FP_FAST_FMAL C99 指示是否支持 long double 类型的快速乘加操作,即 fmal 函数
FP_ILOGB0 C99 ilogb 函数在参数为 0 时的结果
FP_ILOGBNAN C99 ilogb 函数在参数为 NAN 时的结果
math_errhandling C99 定义数学函数使用的错误处理机制
MATH_ERRNO C99 使用 errno
MATH_ERREXCEPT C99 使用 浮点异常
FP_NORMAL C99 作为 fpclassify 的返回值,表示正规浮点值
FP_SUBNORMAL C99 作为 fpclassify 的返回值,表示 次正规数
FP_ZERO C99 作为 fpclassify 的返回值,表示正零或负零
FP_INFINITE C99 作为 fpclassify 的返回值,表示正无穷或负无穷
FP_NAN C99 作为 fpclassify 的返回值,表示不是一个数值(Not A Number)

以下常量不在标准定义中。在 GCC 中可以直接使用;在 MSVC 中使用是,需要在 #include <math.h> 之前定义宏 _USE_MATH_DEFINES

常量 标准 说明
M_PI POSIX 圆周率 \(\pi\)
M_E POSIX 自然常数 \(e\)
M_LOG2E POSIX \(log_2{e}\)
M_LOG10E POSIX \(log_{10}{e}\)
M_LN2 POSIX \(ln{2}\)
M_LN10 POSIX \(ln{10}\)
M_PI_2 POSIX \(\pi/2\)
M_PI_4 POSIX \(\pi/4\)
M_1_PI POSIX \(1/\pi\)
M_2_PI POSIX \(2/\pi\)
M_2_SQRTPI POSIX \(2/\sqrt{\pi}\)
M_SQRT2 POSIX \(\sqrt{2}\)
M_SQRT1_2 POSIX \(1/\sqrt{2}\)

# 函数

基本函数 !id:custom-anchor-basic-functions 标准 说明
fabs C89 计算 double 类型的绝对值
fabsf C99 计算 float 类型的绝对值
fabsl C99 计算 long double 类型的绝对值
fmod C89 double 类型的除法取余,商向 0 取整
fmodf C99 float 类型的除法取余,商向 0 取整
fmodl C99 long double 类型的除法取余,商向 0 取整
remainder C99 double 类型的除法取余,商四舍六入五成双取整
remainderf C99 float 类型的除法取余,商四舍六入五成双取整
remainderl C99 long double 类型的除法取余,商四舍六入五成双取整
remquo C99 double 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数
remquof C99 float 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数
remquol C99 long double 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数
fma C99 double 类型的快速乘加运算(x * y + z
fmaf C99 float 类型的快速乘加运算(x * y + z
fmal C99 long double 类型的快速乘加运算(x * y + z
fmax C99 double 类型取最大值
fmaxf C99 float 类型取最大值
fmaxl C99 long double 类型取最大值
fmin C99 double 类型取最小值
fminf C99 float 类型取最小值
fminl C99 long double 类型取最小值
fdim C99 计算两个 double 值的正差(max(0, x-y)
fdimf C99 计算两个 float 值的正差(max(0, x-y)
fdiml C99 计算两个 long double 值的正差(max(0, x-y)
nan C99 返回一个 double 类型的 NAN
nanf C99 返回一个 float 类型的 NAN
nanl C99 返回一个 long double 类型的 NAN
指数函数 !id:custom-anchor-exponential-functions 标准 说明
exp C89 计算自然常数 e 的幂(\(e^x\)),类型为 double
expf C99 计算自然常数 e 的幂(\(e^x\)),类型为 flaot
expl C99 计算自然常数 e 的幂(\(e^x\)),类型为 long double
exp2 C99 计算 2 的幂(\(2^x\)),类型为 double
exp2f C99 计算 2 的幂(\(2^x\)),类型为 flaot
exp2l C99 计算 2 的幂(\(2^x\)),类型为 long double
expm1 C99 计算自然常数 e 的幂减一(\(e^x-1\)),类型为 double
expm1f C99 计算自然常数 e 的幂减一(\(e^x-1\)),类型为 flaot
expm1l C99 计算自然常数 e 的幂减一(\(e^x-1\)),类型为 long double
log C89 计算底为自然常数 e 的对数(\(\ln(x)\)),类型为 double
logf C99 计算底为自然常数 e 的对数(\(\ln(x)\)),类型为 flaot
logl C99 计算底为自然常数 e 的对数(\(\ln(x)\)),类型为 long double
log10 C99 计算底为 10 的对数(\(\log_{10}(x)\)),类型为 double
log10f C99 计算底为 10 的对数(\(\log_{10}(x)\)),类型为 flaot
log10l C99 计算底为 10 的对数(\(\log_{10}(x)\)),类型为 long double
log2 C99 计算底为 2 的对数(\(\log_{2}(x)\)),类型为 double
log2f C99 计算底为 2 的对数(\(\log_{2}(x)\)),类型为 flaot
log2l C99 计算底为 2 的对数(\(\log_{2}(x)\)),类型为 long double
log1p C99 计算底为自然常数 e,幂为 1 + x 的对数(\(\log_{2}(1+x)\)),类型为 double
log1pf C99 计算底为自然常数 e,幂为 1 + x 的对数的对数(\(\log_{2}(1+x)\)),类型为 flaot
log1pl C99 计算底为自然常数 e,幂为 1 + x 的对数的对数(\(\log_{2}(1+x)\)),类型为 long double
幂函数 !id:custom-anchor-power-functions 标准 说明
pow C89 计算乘方(\(x^y\)),类型为 double
powf C99 计算乘方(\(x^y\)),类型为 flaot
powl C99 计算乘方(\(x^y\)),类型为 long double
sqrt C89 计算平方根(\(\sqrt{x}\)),类型为 double
sqrtf C99 计算平方根(\(\sqrt{x}\)),类型为 flaot
sqrtl C99 计算平方根(\(\sqrt{x}\)),类型为 long double
cbrt C99 计算三次方根(\(\sqrt[3]{x}\)),类型为 double
cbrtf C99 计算三次方根(\(\sqrt[3]{x}\)),类型为 flaot
cbrtl C99 计算三次方根(\(\sqrt[3]{x}\)),类型为 long double
hypot C99 计算平方和的根(\(\sqrt{x^2 + y^2}\)),类型为 double
hypotf C99 计算平方和的根(\(\sqrt{x^2 + y^2}\)),类型为 flaot
hypotl C99 计算平方和的根(\(\sqrt{x^2 + y^2}\)),类型为 long double
三级函数 !id:custom-anchor-trigonometric-functions 标准 说明
sin C89 计算 double 类型的正弦(\(\sin(x)\)
sinf C99 计算 float 类型的正弦(\(\sin(x)\)
sinl C99 计算 long double 类型的正弦(\(\sin(x)\)
cos C89 计算 double 类型的余弦(\(\cos(x)\)
cosf C99 计算 float 类型的余弦(\(\cos(x)\)
cosl C99 计算 long double 类型的余弦(\(\cos(x)\)
tan C89 计算 double 类型的正切(\(\tan(x)\)
tanf C99 计算 float 类型的正切(\(\tan(x)\)
tanl C99 计算 long double 类型的正切(\(\tan(x)\)
asin C89 计算 double 类型的反正弦(\(\arcsin(x)\)
asinf C99 计算 float 类型的反正弦(\(\arcsin(x)\)
asinl C99 计算 long double 类型的反正弦(\(\arcsin(x)\)
acos C89 计算 double 类型的反余弦(\(\arccos(x)\)
acosf C99 计算 float 类型的反余弦(\(\arccos(x)\)
acosl C99 计算 long double 类型的反余弦(\(\arccos(x)\)
atan C89 计算 double 类型的反正切(\(\arctan(x)\)
atanf C99 计算 float 类型的反正切(\(\arctan(x)\)
atanl C99 计算 long double 类型的反正切(\(\arctan(x)\)
双曲函数 !id:custom-anchor-hyperbolic-functions 标准 说明
sinh C89 计算 double 类型的双曲正弦(\(\sinh(x)\)
sinhf C99 计算 float 类型的双曲正弦(\(\sinh(x)\)
sinhl C99 计算 long double 类型的双曲正弦(\(\sinh(x)\)
cosh C89 计算 double 类型的双曲余弦(\(\cosh(x)\)
coshf C99 计算 float 类型的双曲余弦(\(\cosh(x)\)
coshl C99 计算 long double 类型的双曲余弦(\(\cosh(x)\)
tanh C89 计算 double 类型的双曲正切(\(\tanh(x)\)
tanhf C99 计算 float 类型的双曲正切(\(\tanh(x)\)
tanhf C99 计算 long double 类型的双曲正切(\(\tanh(x)\)
asinh C99 计算 double 类型的反双曲正弦(\(arcsinh(x)\)
asinhf C99 计算 float 类型的反双曲正弦(\(arcsinh(x)\)
asinhl C99 计算 long double 类型的反双曲正弦(\(arcsinh(x)\)
acosh C99 计算 double 类型的反双曲余弦(\(arccosh(x)\)
acoshf C99 计算 float 类型的反双曲余弦(\(arccosh(x)\)
acoshl C99 计算 long double 类型的反双曲余弦(\(arccosh(x)\)
atanh C99 计算 double 类型的反双曲正切(\(arctanh(x)\)
atanhf C99 计算 float 类型的反双曲正切(\(arctanh(x)\)
atanhl C99 计算 long double 类型的反双曲正切(\(arctanh(x)\)
误差与 Gamma 函数 !id:custom-anchor-error-functions 标准 说明
erf C99 计算 double 类型的误差函数
erff C99 计算 float 类型的误差函数
erfl C99 计算 long double 类型的误差函数
erfc C99 计算 double 类型的互补误差函数
erfcf C99 计算 float 类型的互补误差函数
erfcl C99 计算 long double 类型的互补误差函数
tgamma C99 计算 double 类型的 Gamma 函数
tgammaf C99 计算 float 类型的 Gamma函数
tgammal C99 计算 long double 类型的 Gamma 函数
lgamma C99 计算 double 类型 Gamma 函数的自然对数
lgammaf C99 计算 float 类型 Gamma 函数的自然对数
lgammal C99 计算 long double 类型 Gamma 函数的自然对数
近似取整函数 !id:custom-anchor-nearest-integer-functions 标准 说明
ceil C89 double 类型向上取整(\(\lceil x \rceil\)
ceilf C99 float 类型向上取整(\(\lceil x \rceil\)
ceill C99 long double 类型向上取整(\(\lceil x \rceil\)
floor C89 double 类型向下取整(\(\lfloor x \rfloor\)
floorf C99 float 类型向下取整(\(\lfloor x \rfloor\)
floorl C99 long double 类型向下取整(\(\lfloor x \rfloor\)
trunc C99 double 类型向零取整
truncf C99 float 类型向零取整
truncl C99 long double 类型向零取整
round C99 double 类型四舍五入取整
roundf C99 float 类型四舍五入取整
roundl C99 long double 类型四舍五入取整
lround C99 doublelong int 的四舍五入取整
lroundf C99 floatlong int 的四舍五入取整
lroundl C99 long doublelong int 的四舍五入取整
llround C99 doublelong long int 的四舍五入取整
llroundf C99 floatlong long int 的四舍五入取整
llroundl C99 long doublelong long int 的四舍五入取整
nearbyint C99 double 类型按照 当前舍入模式 取整
nearbyintf C99 float 类型按照 当前舍入模式 取整
nearbyintl C99 long double 类型按照 当前舍入模式 取整
rint C99 double 类型按照 当前舍入模式 取整
rintf C99 float 类型按照 当前舍入模式 取整
rintl C99 long double 类型按照 当前舍入模式 取整
lrint C99 doublelong int 类型按照 当前舍入模式 取整
lrintf C99 floatlong int 类型按照 当前舍入模式 取整
lrintl C99 long doublelong int 类型按照 当前舍入模式 取整
llrint C99 doublelong long int 类型按照 当前舍入模式 取整
llrintf C99 floatlong long int 类型按照 当前舍入模式 取整
llrintl C99 long doublelong long int 类型按照 当前舍入模式 取整
浮点操作函数 !id:custom-anchor-float-manipulation-functions 标准 说明
frexp C89 double 分解为有效数字和 2 的幂
frexpf C99 float 分解为有效数字和 2 的幂
frexpl C99 long double 分解为有效数字和 2 的幂
ldexp C89 double 乘以 2 的幂
ldexpf C99 float 乘以 2 的幂
ldexpl C99 long double 乘以 2 的幂
modf C89 double 分解为整数部分和小数部分
modff C99 float 分解为整数部分和小数部分
modfl C99 long double 分解为整数部分和小数部分
scalbn C99 高效计算 FLT_RADIXint 次幂,结果为 double
scalbnf C99 高效计算 FLT_RADIXint 次幂,结果为 float
scalbnl C99 高效计算 FLT_RADIXint 次幂,结果为 long double
scalbln C99 高效计算 FLT_RADIXlong int 次幂,结果为 double
scalblnf C99 高效计算 FLT_RADIXlong int 次幂,结果为 float
scalblnl C99 高效计算 FLT_RADIXlong int 次幂,结果为 long double
ilogb C99 double 中提取 int 类型的指数
ilogbf C99 float 中提取 int 类型的指数
ilogbl C99 long double 中提取 int 类型的指数
logb C99 double 中提取 double 类型的指数
logbf C99 float 中提取 float 类型的指数
logbl C99 long double 中提取 long double 类型的指数
nextafter C99 获得 double 类型的下一个可表示的浮点数
nextafterf C99 获得 float 类型的下一个可表示的浮点数
nextafterl C99 获得 long double 类型的下一个可表示的浮点数
nexttoward C99 获得 double 类型的下一个可表示的浮点数
nexttowardf C99 获得 float 类型的下一个可表示的浮点数
nexttowardl C99 获得 long double 类型的下一个可表示的浮点数
copysign C99 拷贝 double 类型的符号位
copysignf C99 拷贝 float 类型的符号位
copysignl C99 拷贝 long double 类型的符号位
判断函数 !id:custom-anchor-check-functions 标准 说明
fpclassify C99 获得浮点数的分类
isfinite C99 判断浮点数是否有一个有限值(NANINFINITY 均不是)
isinf C99 判断浮点数是否是无限
isnan C99 判断浮点数是否不是数值(Not A Number)
signbit C99 判断浮点数是否为负
isgreater C99 判断大于
isgreaterequal C99 判断大于等于
isless C99 判断小于
islessequal C99 判断小于等于
islessgreater C99 判断大于或小于
isunordered C99 判断无序,即至少一个是 NAN

# 推荐阅读

本文 更新于: 2025-11-27 09:38:06 创建于: 2025-11-27 09:38:06