# C 语言标准库头文件 math.h
这个头文件提供 数学 的相关功能,例如计算指数,对数,三角函数以及近似取整等。
需要链接数学库,例如在 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 |
double 到 long int 的四舍五入取整 |
lroundf |
C99 |
float 到 long int 的四舍五入取整 |
lroundl |
C99 |
long double 到 long int 的四舍五入取整 |
llround |
C99 |
double 到 long long int 的四舍五入取整 |
llroundf |
C99 |
float 到 long long int 的四舍五入取整 |
llroundl |
C99 |
long double 到 long long int 的四舍五入取整 |
nearbyint |
C99 |
double 类型按照 当前舍入模式 取整 |
nearbyintf |
C99 |
float 类型按照 当前舍入模式 取整 |
nearbyintl |
C99 |
long double 类型按照 当前舍入模式 取整 |
rint |
C99 |
double 类型按照 当前舍入模式 取整 |
rintf |
C99 |
float 类型按照 当前舍入模式 取整 |
rintl |
C99 |
long double 类型按照 当前舍入模式 取整 |
lrint |
C99 |
double 到 long int 类型按照 当前舍入模式 取整 |
lrintf |
C99 |
float 到 long int 类型按照 当前舍入模式 取整 |
lrintl |
C99 |
long double 到 long int 类型按照 当前舍入模式 取整 |
llrint |
C99 |
double 到 long long int 类型按照 当前舍入模式 取整 |
llrintf |
C99 |
float 到 long long int 类型按照 当前舍入模式 取整 |
llrintl |
C99 |
long double 到 long 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_RADIX 的 int 次幂,结果为 double |
scalbnf |
C99 |
高效计算 FLT_RADIX 的 int 次幂,结果为 float |
scalbnl |
C99 |
高效计算 FLT_RADIX 的 int 次幂,结果为 long double |
scalbln |
C99 |
高效计算 FLT_RADIX 的 long int 次幂,结果为 double |
scalblnf |
C99 |
高效计算 FLT_RADIX 的 long int 次幂,结果为 float |
scalblnl |
C99 |
高效计算 FLT_RADIX 的 long 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 |
判断浮点数是否有一个有限值(NAN 和 INFINITY 均不是) |
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