C语言 标准库详解
编程小白也能轻松理解的数学函数指南
编译时需链接数学库:gcc program.c -o program -lm
常用数学常量
-
M_PI – π的值(≈3.14159)
圆周率,用于所有与圆相关的计算
-
M_E – 自然常数e(≈2.71828)
自然对数的底数,出现在指数和增长模型中
-
M_SQRT2 – √2(≈1.41421)
2的平方根,常见于几何计算
-
INFINITY – 表示无穷大
当一个计算结果超出double能表示的范围时使用
-
NAN – 表示”非数字”(Not a Number)
当数学运算结果未定义时返回(如√(-1))
基本数学函数
-
pow(x, y) – 计算x的y次方(xy)
例子:pow(2, 3) = 8,pow(9, 0.5) = 3
-
sqrt(x) – 计算平方根(√x)
例子:sqrt(25) = 5,sqrt(2) ≈ 1.414
-
fabs(x) – 浮点数的绝对值
例子:fabs(-3.5) = 3.5
-
ceil(x) – 向上取整(天花板函数)
例子:ceil(4.2) = 5,ceil(-2.7) = -2
-
floor(x) – 向下取整(地板函数)
例子:floor(4.8) = 4,floor(-2.3) = -3
-
fmod(x, y) – 浮点数取余数
例子:fmod(10.5, 3.2) ≈ 0.9
指数与对数函数
-
exp(x) – 计算e的x次方(eˣ)
例子:exp(1) ≈ 2.718,exp(0) = 1
-
log(x) – 自然对数(ln x)
例子:log(1) = 0,log(M_E) = 1
-
log10(x) – 以10为底的对数(log₁₀ x)
例子:log10(100) = 2,log10(1000) = 3
-
log2(x) – 以2为底的对数(log₂ x)
例子:log2(8) = 3,log2(256) = 8
-
exp2(x) – 计算2的x次方(2ˣ)
例子:exp2(3) = 8,exp2(10) = 1024
三角函数
基本三角函数:
-
sin(x) – 正弦函数
例子:sin(0) = 0,sin(M_PI/2) = 1
-
cos(x) – 余弦函数
例子:cos(0) = 1,cos(M_PI) = -1
-
tan(x) – 正切函数
例子:tan(0) = 0,tan(M_PI/4) ≈ 1
反三角函数:
-
asin(x) – 反正弦函数
返回弧度值(范围:-π/2到π/2)
-
acos(x) – 反余弦函数
返回弧度值(范围:0到π)
-
atan(x) – 反正切函数
返回弧度值(范围:-π/2到π/2)
双曲函数:
- sinh(x) – 双曲正弦
- cosh(x) – 双曲余弦
- tanh(x) – 双曲正切
其他实用函数
-
hypot(x, y) – 计算直角三角形的斜边长度
√(x² + y²),比手动计算更精确
-
fmax(x, y) – 返回两个浮点数中较大的
例子:fmax(3.5, 7.2) = 7.2
-
fmin(x, y) – 返回两个浮点数中较小的
例子:fmin(3.5, 7.2) = 3.5
-
round(x) – 四舍五入到最接近的整数
例子:round(3.4) = 3,round(3.6) = 4
-
trunc(x) – 去掉小数部分,保留整数部分
例子:trunc(3.9) = 3,trunc(-2.7) = -2
-
isnan(x) – 检查x是否为非数字(NAN)
例子:isnan(sqrt(-1)) 返回 true
-
isinf(x) – 检查x是否为无穷大
例子:isinf(1.0 / 0.0) 返回 true
特殊返回值处理
C语言数学函数在遇到特殊输入时会有特定行为:
当输入超出定义域: 如 sqrt(-1) 或 log(-5) 会返回 NAN(非数字)值
当结果溢出: 如 pow(10, 1000) 会返回 INFINITY(正无穷大)
当输入无穷大: 如 sin(INFINITY) 会返回 NAN
在编写程序时,建议使用 isnan() 和 isinf() 函数检查这些特殊情况!
完整代码示例
/* 基本math.h函数使用示例 */ #include <stdio.h> #include <math.h> // 包含数学库头文件 int main() { // 常量使用 printf("圆周率 π ≈ %f\n", M_PI); printf("自然常数 e ≈ %f\n", M_E); // 指数和对数 printf("2的10次方 = %f\n", pow(2, 10)); // 1024 printf("e的平方 ≈ %f\n", exp(2)); // ~7.389 printf("log10(1000) = %f\n", log10(1000)); // 3 // 三角形计算 double angle = M_PI / 3; // 60度 printf("sin(60°) = %f\n", sin(angle)); // ~0.866 printf("cos(60°) = %f\n", cos(angle)); // 0.5 // 取整函数 printf("ceil(3.2) = %f\n", ceil(3.2)); // 4.0 printf("floor(3.8) = %f\n", floor(3.8)); // 3.0 printf("round(3.5) = %f\n", round(3.5)); // 4.0 // 特殊值处理 double result = sqrt(-1); // 无效运算 if (isnan(result)) { printf("sqrt(-1) 无效!返回了 NAN\n"); } return 0; }
重要提示:
1. 在使用math.h中的函数时,编译时需要链接数学库:在gcc中添加 -lm 参数
2. 三角函数使用弧度制而非角度制,可使用 角度 * M_PI / 180 转换
3. 浮点数计算可能存在精度误差,比较浮点数时应使用范围而非精确相等
4. 对于整数绝对值,应使用stdlib.h中的abs()而非math.h的fabs()