标准数学库(math.h或cmath)提供了丰富的数学计算函数,其中三角函数、对数函数和指数函数是编程中处理几何、科学计算问题的基础工具。
57.1 数学库的使用
- 头包含:
- C语言中需包含
<math.h>。
- C++中需包含
<cmath>(推荐)或<math.h>。
- 编译链接:部分编译器(如GCC)使用数学库函数时,需在编译命令中添加-lm选项(链接数学库)。
- 数据类型:函数参数和返回值多为double类型,部分函数提供float(后缀f)和long double (后缀l)版本(如sinf、sinl),本章以double类型为主。
- 错误处理:当输入参数无效时(如对数参数为负数),函数行为由编译器实现定义,可能返回NaN(非数字)或引发域错误,编程中需保证输入合法。
57.2 三角函数
三角函数以弧度为单位接收参数,涉及角度计算时需先将角度转换为弧度,转换公式:
弧度=角度×180π
57.2.1 基本三角函数
-
正弦函数sin
- 函数原型:
double sin(double x);
- 功能:计算x(弧度)的正弦值。
- 参数:x无取值范围限制,函数自动按周期2π处理。
- 返回值:范围[−1.0,1.0]。
- 示例:sin(π/2)=1.0,sin(0)=0.0。
-
余弦函数cos
- 函数原型:
double cos(double x);
- 功能:计算x(弧度)的余弦值。
- 参数:x无取值限制,周期2π。
- 返回值:范围[−1.0,1.0]。
- 示例:cos(0)=1.0,cos(π)=−1.0。
-
正切函数tan
- 函数原型:
double tan(double x);
- 功能:计算sin(x)/cos(x)。
- 参数:当x=π/2+kπ(k为整数),分母为0,返回正负无穷。
- 返回值:取值范围(−∞,+∞)。
- 示例:tan(π/4)=1.0,tan(0)=0.0。
57.2.2 反三角函数
-
反正弦函数asin
- 原型:
double asin(double x);
- 功能:计算arcsin(x)。
- 参数:x∈[−1.0,1.0],超出返回NaN。
- 返回值:弧度,区间[−π/2,π/2]。
- 示例:asin(1.0)=π/2,asin(0)=0.0。
-
反余弦函数acos
- 原型:
double acos(double x);
- 功能:计算arccos(x)。
- 参数:x∈[−1.0,1.0],超出返回NaN。
- 返回值:弧度,区间[0,π]。
- 示例:acos(1.0)=0,acos(−1.0)=π。
-
反正切函数atan
- 原型:
double atan(double x);
- 功能:计算arctan(x)。
- 参数:任意实数。
- 返回值:弧度,区间(−π/2,π/2)。
- 示例:atan(1.0)=π/4,atan(0)=0.0。
57.2.3 角度与弧度转换
弧度转角度
角度=弧度×π180
宏定义示例:#define rad2deg(x) (x * 180.0 / M_PI)
角度转弧度
弧度=角度×180π
宏定义示例:#define deg2rad(x) (x * M_PI / 180.0)
常量说明:M_PI代表圆周率π≈3.141592653589793,部分编译器需要先定义#define _USE_MATH_DEFINES才能使用。
57.3 对数函数
57.3.1 自然对数log(以e为底)
- 原型:
double log(double x);
- 功能:计算lnx,满足ey=x。
- 参数:x>0,否则返回NaN。
- 返回值:全体实数范围。
- 示例:log(1.0)=0.0,log(e)=1.0。
57.3.2 常用对数log10(以10为底)
- 原型:
double log10(double x);
- 功能:计算lgx,满足10y=x。
- 参数:x>0,否则返回NaN。
- 示例:log10(10.0)=1.0,log10(0.1)=−1.0。
57.3.3 任意底数对数(换底公式)
loga(x)=log(a)log(x)=log10(a)log10(x)
约束:a>0,a=1,x>0
示例:log2(8)=log(8)/log(2)=3.0
57.3.4 以2为底log2(C99标准)
- 原型:
double log2(double x);
- 参数:x>0
- 示例:log2(8.0)=3.0
57.4 指数函数
57.4.1 自然指数e^xp(底数e)
- 原型:
double e^xp(double x);
- 功能:计算ex,e≈2.71828。
- 参数:任意实数,过大时返回无穷大。
- 返回值:(0,+∞)
- 示例:exp(0.0)=1.0,exp(ln(2.0))=2.0。
57.4.2 幂函数pow
- 原型:
double pow(double x, double y);
- 功能:xy
- 参数限制:
- x<0时,y必须是整数;
- x=0且y≤0返回NaN。
- 示例:pow(2.0,3.0)=8.0,pow(4.0,0.5)=2.0。
57.4.3 平方根sqrt
- 原型:
double sqrt(double x);
- 功能:x=x0.5
- 参数:x≥0,负数返回NaN。
- 示例:4.0=2.0。
57.4.4 立方根cbrt(C99)
- 原型:
double cbrt(double x);
- 功能:x1/3
- 参数:正负实数均可。
- 示例:cbrt(−8.0)=−2.0。
57.5 函数使用注意事项
- 参数合法性
- asin、acos 参数必须在[−1,1];
- log/log10/log2 参数必须大于0;
- sqrt 参数不能为负数;
非法输入会得到NaN,造成计算错误。
- 浮点数精度误差
如0.1+0.2=0.3,判断相等需用误差区间:fabs(a−b)<1e−9。
- 单位区分:三角函数输入输出全为弧度,角度必须转换。
- 常量兼容:VS等编译器需
#define _USE_MATH_DEFINES才能使用M_PI。
- 返回值范围
- sin/cos:[−1,1]
- asin:[−π/2,π/2],acos:[0,π]
- e^xp恒正,对数可正可负