Skip to main content

第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.0sin(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.0cos(π)=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\pikk为整数),分母为0,返回正负无穷。
    • 返回值:取值范围(,+)(-\infty,+\infty)
    • 示例:tan(π/4)=1.0\tan(\pi/4)=1.0tan(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/2asin(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)=0acos(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/4atan(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);
  • 功能:计算lnx\ln x,满足ey=xe^y = x
  • 参数:x>0x>0,否则返回NaN。
  • 返回值:全体实数范围。
  • 示例:log(1.0)=0.0\\log(1.0)=0.0log(e)=1.0\\log(e)=1.0

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

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

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

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

约束:a>0,a1,x>0a>0, a \neq 1, x>0 示例:log2(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 自然指数e^xp(底数ee

  • 原型:double e^xp(double x);
  • 功能:计算exe^xe2.71828e\approx2.71828
  • 参数:任意实数,过大时返回无穷大。
  • 返回值:(0,+)(0,+\infty)
  • 示例:exp(0.0)=1.0exp(0.0)=1.0exp(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=0y0y\le0返回NaN。
  • 示例:pow(2.0,3.0)=8.0{pow}(2.0,3.0)=8.0pow(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}
  • 参数:x0x \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.20.30.1+0.2 \neq 0.3,判断相等需用误差区间:fabs(ab)<1e9{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]
    • e^xp恒正,对数可正可负