第57章 常用数学函数

第57章 常用数学函数

标准数学库(math.h或cmath)提供了丰富的数学计算函数,其中三角函数、对数函数和指数函数是编程中处理几何、科学计算问题的基础工具。

57.1 数学库的使用

  • 头包含:
    1. C语言中需包含<math.h>。
    2. C++中需包含<cmath>(推荐)或<math.h>。
  • 编译链接:部分编译器(如GCC)使用数学库函数时,需在编译命令中添加-lm选项(链接数学库)。
  • 数据类型:函数参数和返回值多为double类型,部分函数提供float(后缀f)和long double (后缀l)版本(如sinf、sinl),本章以double类型为主。
  • 错误处理:当输入参数无效时(如对数参数为负数),函数行为由编译器实现定义,可能返回NaN(非数字)或引发域错误,编程中需保证输入合法。

57.2 三角函数

三角函数以弧度为单位接收参数,涉及角度计算时需先将角度转换为弧度,转换公式:

弧度=角度×π180{弧度} = {角度} \times \frac{\pi}{180}

57.2.1 基本三角函数

  1. 正弦函数sin

    • 函数原型:double sin(double x);
    • 功能:计算xx(弧度)的正弦值。
    • 参数:xx无取值范围限制,函数自动按周期2π2\pi处理。
    • 返回值:范围[−1.0,1.0][-1.0, 1.0]。
    • 示例:sin⁡(π/2)=1.0\sin(\pi/2)=1.0,sin(0)=0.0\\sin(0)=0.0。
  2. 余弦函数cos

    • 函数原型:double cos(double x);
    • 功能:计算xx(弧度)的余弦值。
    • 参数:xx无取值限制,周期2π2\pi。
    • 返回值:范围[−1.0,1.0][-1.0, 1.0]。
    • 示例:cos(0)=1.0\\cos(0)=1.0,cos⁡(π)=−1.0\cos(\pi)=-1.0。
  3. 正切函数tan

    • 函数原型:double tan(double x);
    • 功能:计算sin⁡(x)/cos⁡(x)\sin(x)/\cos(x)。
    • 参数:当x=π/2+kπx=\pi/2 + k\pi(kk为整数),分母为0,返回正负无穷。
    • 返回值:取值范围(−∞,+∞)(-\infty,+\infty)。
    • 示例:tan⁡(π/4)=1.0\tan(\pi/4)=1.0,tan(0)=0.0\\tan(0)=0.0。

57.2.2 反三角函数

  1. 反正弦函数asin

    • 原型:double asin(double x);
    • 功能:计算arcsin(x)\\arcsin(x)。
    • 参数:x∈[−1.0,1.0]x \in [-1.0, 1.0],超出返回NaN。
    • 返回值:弧度,区间[−π/2,π/2][-\pi/2, \pi/2]。
    • 示例:asin(1.0)=π/2{asin}(1.0)=\pi/2,asin(0)=0.0{asin}(0)=0.0。
  2. 反余弦函数acos

    • 原型:double acos(double x);
    • 功能:计算arccos(x)\\arccos(x)。
    • 参数:x∈[−1.0,1.0]x \in [-1.0, 1.0],超出返回NaN。
    • 返回值:弧度,区间[0,π][0, \pi]。
    • 示例:acos(1.0)=0{acos}(1.0)=0,acos(−1.0)=π{acos}(-1.0)=\pi。
  3. 反正切函数atan

    • 原型:double atan(double x);
    • 功能:计算arctan(x)\\arctan(x)。
    • 参数:任意实数。
    • 返回值:弧度,区间(−π/2,π/2)(-\pi/2, \pi/2)。
    • 示例:atan(1.0)=π/4{atan}(1.0)=\pi/4,atan(0)=0.0{atan}(0)=0.0。

57.2.3 角度与弧度转换

弧度转角度

角度=弧度×180π{角度} = {弧度} \times \frac{180}{\pi}

宏定义示例:#define rad2deg(x) (x * 180.0 / M_PI)

角度转弧度

弧度=角度×π180{弧度} = {角度} \times \frac{\pi}{180}

宏定义示例:#define deg2rad(x) (x * M_PI / 180.0)

常量说明:M_PI代表圆周率π≈3.141592653589793\pi \approx 3.141592653589793,部分编译器需要先定义#define _USE_MATH_DEFINES才能使用。

57.3 对数函数

57.3.1 自然对数log(以ee为底)

  • 原型:double log(double x);
  • 功能:计算ln⁡x\ln x,满足ey=xe^y = x。
  • 参数:x>0x>0,否则返回NaN。
  • 返回值:全体实数范围。
  • 示例:log(1.0)=0.0\\log(1.0)=0.0,log(e)=1.0\\log(e)=1.0。

57.3.2 常用对数log10(以10为底)

  • 原型:double log10(double x);
  • 功能:计算lg⁡x\lg x,满足10y=x10^y = x。
  • 参数:x>0x>0,否则返回NaN。
  • 示例:log10(10.0)=1.0\\log10(10.0)=1.0,log⁡10(0.1)=−1.0\log10(0.1)=-1.0。

57.3.3 任意底数对数(换底公式)

log⁡a(x)=log⁡(x)log⁡(a)=log⁡10(x)log⁡10(a)\log_a(x) = \frac{\log(x)}{\log(a)} = \frac{\log_{10}(x)}{\log_{10}(a)}

约束:a>0,a≠1,x>0a>0, a \neq 1, x>0 示例:log⁡2(8)=log⁡(8)/log⁡(2)=3.0\log_2(8) = \log(8)/\log(2) = 3.0

57.3.4 以2为底log2(C99标准)

  • 原型:double log2(double x);
  • 参数:x>0x>0
  • 示例:log2(8.0)=3.0\\log2(8.0)=3.0

57.4 指数函数

57.4.1 自然指数函数 exp(底数ee)

  • 原型:double exp(double x);
  • 功能:计算exe^x,e≈2.71828e\approx2.71828。
  • 参数:任意实数,过大时返回无穷大。
  • 返回值:(0,+∞)(0,+\infty)
  • 示例:exp(0.0)=1.0exp(0.0)=1.0,exp(ln⁡(2.0))=2.0exp(\ln(2.0))=2.0。

57.4.2 幂函数pow

  • 原型:double pow(double x, double y);
  • 功能:xyx^y
  • 参数限制:
    1. x<0x<0时,yy必须是整数;
    2. x=0x=0且y≤0y\le0返回NaN。
  • 示例:pow(2.0,3.0)=8.0{pow}(2.0,3.0)=8.0,pow(4.0,0.5)=2.0{pow}(4.0,0.5)=2.0。

57.4.3 平方根sqrt

  • 原型:double sqrt(double x);
  • 功能:x=x0.5\sqrt{x} = x^{0.5}
  • 参数:x≥0x \ge 0,负数返回NaN。
  • 示例:4.0=2.0\sqrt{4.0}=2.0。

57.4.4 立方根cbrt(C99)

  • 原型:double cbrt(double x);
  • 功能:x1/3x^{1/3}
  • 参数:正负实数均可。
  • 示例:cbrt(−8.0)=−2.0{cbrt}(-8.0)=-2.0。

57.5 函数使用注意事项

  1. 参数合法性
    • asin、acos 参数必须在[−1,1][-1,1];
    • log/log10/log2 参数必须大于0;
    • sqrt 参数不能为负数; 非法输入会得到NaN,造成计算错误。
  2. 浮点数精度误差 如0.1+0.2≠0.30.1+0.2 \neq 0.3,判断相等需用误差区间:fabs(a−b)<1e−9{fabs}(a-b) < 1e-9。
  3. 单位区分:三角函数输入输出全为弧度,角度必须转换。
  4. 常量兼容:VS等编译器需#define _USE_MATH_DEFINES才能使用M_PI。
  5. 返回值范围
    • sin/cos:[−1,1][-1,1]
    • asin:[−π/2,π/2][-\pi/2, \pi/2],acos:[0,π][0,\pi]
    • exp恒正,对数可正可负

57.6 选择题练习(含参考答案)

参考答案与解析(点击展开)
  1. B —— sin(x) 以弧度为参数;π/2\pi/2 弧度 = 90°,sin⁡(90∘)=1\sin(90^\circ)=1。
  2. B —— log⁡2(8)=3\log_2(8)=3,因为 23=82^3=8;也可由 log2(8.0) 返回 3.0 验证。
  3. B —— 弧度 = 角度 × π/180\pi/180,例如 180° 对应 π\pi。
  4. A —— exp(x) 返回 exe^x(e≈2.71828e\approx2.71828),定义域为任意实数,返回值恒正。
  5. B —— 浮点数存在精度误差,应使用误差区间判断:fabs(a-b) < 1e-9。
  1. sin⁡(π/2)\sin(\pi/2) 的返回值(其中 π/2\pi/2 是 90° 对应的弧度)是?(  )

    • A. 0
    • B. 1
    • C. -1
    • D. 0.5
  2. 调用 log2(8.0),返回值是?(  )

    • A. 2
    • B. 3
    • C. 8
    • D. 0.5
  3. 将角度转换为弧度的公式是?(  )

    • A. 弧度 = 角度 × 180 / π\pi
    • B. 弧度 = 角度 × π\pi / 180
    • C. 弧度 = 角度 / π\pi
    • D. 弧度 = 角度 × π\pi
  4. 关于 exp(x) 函数,下列说法正确的是?(  )

    • A. 返回 exe^x(e≈2.71828e\approx2.71828)
    • B. 返回以 10 为底的对数
    • C. 参数必须大于 0
    • D. 返回值可能为负数
  5. 在 C++ 中比较两个 double 是否"相等",推荐做法是?(  )

    • A. 直接用 a == b
    • B. 用 fabs(a - b) < 1e-9 判断误差区间
    • C. 用 a - b == 0
    • D. 以上都不对
SShowball OI知识手册