math — 数学函数


此模块提供对常见数学函数和常量的访问,包括 C 标准定义的那些。

这些函数不能用于复数;如果需要复数支持,请使用 cmath 模块中同名的函数。区分支持复数和不支持复数的函数是因为大多数用户不想学习理解复数所需的那么多数学知识。接收异常而不是复数结果允许更早地检测到作为参数使用的意外复数,以便程序员可以确定它最初是如何以及为何生成的。

此模块提供以下函数。除非另有明确说明,否则所有返回值均为浮点数。

数论函数

comb(n, k)

n 个项目中选择 k 个项目而无需重复且不考虑顺序的方法数

factorial(n)

n 的阶乘

gcd(*integers)

整数参数的最大公约数

isqrt(n)

非负整数 n 的整数平方根

lcm(*integers)

整数参数的最小公倍数

perm(n, k)

n 个项目中选择 k 个项目而无需重复且考虑顺序的方法数

浮点数运算

ceil(x)

x 的上限,即大于或等于 x 的最小整数

fabs(x)

x 的绝对值

floor(x)

x 的下限,即小于或等于 x 的最大整数

fma(x, y, z)

融合乘加运算:(x * y) + z

fmod(x, y)

除法 x / y 的余数

modf(x)

x 的小数部分和整数部分

remainder(x, y)

x 相对于 y 的余数

trunc(x)

x 的整数部分

浮点数操作函数

copysign(x, y)

x 的大小(绝对值),带 y 的符号

frexp(x)

x 的尾数和指数

isclose(a, b, rel_tol, abs_tol)

检查值 ab 是否彼此接近

isfinite(x)

检查 x 既不是无穷大也不是 NaN

isinf(x)

检查 x 是否为正无穷大或负无穷大

isnan(x)

检查 x 是否为 NaN(非数字)

ldexp(x, i)

x * (2**i),函数 frexp() 的逆运算

nextafter(x, y, steps)

xy 经过 steps 步的浮点值

ulp(x)

x 的最低有效位的数值

幂、指数和对数函数

cbrt(x)

x 的立方根

exp(x)

ex 次幂

exp2(x)

2x 次幂

expm1(x)

ex 次幂,减去 1

log(x, base)

x 以给定底数(默认为 e)的对数

log1p(x)

1+x 的自然对数(底数为 e

log2(x)

x 的以 2 为底的对数

log10(x)

x 的以 10 为底的对数

pow(x, y)

xy 次幂

sqrt(x)

x 的平方根

求和与乘积函数

dist(p, q)

两个点 pq(作为坐标的可迭代对象给出)之间的欧几里得距离

fsum(iterable)

输入 iterable 中值的和

hypot(*coordinates)

坐标可迭代对象的欧几里得范数

prod(iterable, start)

输入 iterable 中元素的乘积,带有一个 start

sumprod(p, q)

两个可迭代对象 pq 的乘积之和

角度转换

degrees(x)

将角度 x 从弧度转换为度数

radians(x)

将角度 x 从度数转换为弧度

三角函数

acos(x)

x 的反余弦

asin(x)

x 的反正弦

atan(x)

x 的反正切

atan2(y, x)

atan(y / x)

cos(x)

x 的余弦

sin(x)

x 的正弦

tan(x)

x 的正切

双曲函数

acosh(x)

x 的反双曲余弦

asinh(x)

x 的反双曲正弦

atanh(x)

x 的反双曲正切

cosh(x)

x 的双曲余弦

sinh(x)

x 的双曲正弦

tanh(x)

x 的双曲正切

特殊函数

erf(x)

x 处的误差函数

erfc(x)

x 处的互补误差函数

gamma(x)

x 处的伽马函数

lgamma(x)

x伽马函数绝对值的自然对数

常量

pi

π = 3.141592…

e

e = 2.718281…

tau

τ = 2π = 6.283185…

inf

正无穷大

nan

“非数字”(NaN)

数论函数

math.comb(n, k)

返回从 n 个项目中选择 k 个项目而无需重复且不考虑顺序的方法数。

k <= n 时,计算结果为 n! / (k! * (n - k)!);当 k > n 时,计算结果为零。

也称为二项式系数,因为它等同于多项式展开式 (1 + x)ⁿ 中第 k 项的系数。

如果任一参数不是整数,则引发 TypeError。如果任一参数为负数,则引发 ValueError

在 3.8 版本加入。

math.factorial(n)

返回非负整数 n 的阶乘。

版本 3.10 中有改变: 不再接受带有整数值的浮点数(如 5.0)。

math.gcd(*integers)

返回指定整数参数的最大公约数。如果任何参数不为零,则返回值为所有参数的最大正整数公约数。如果所有参数均为零,则返回值为 0gcd() 不带参数时返回 0

在 3.5 版本加入。

版本 3.9 中有改变: 增加了对任意数量参数的支持。以前只支持两个参数。

math.isqrt(n)

返回非负整数 n 的整数平方根。这是 n 的精确平方根的下限,或者等价于最大的整数 a 使得 a² ≤ n

对于某些应用,拥有最小整数 a 使得 na² 可能更方便,换句话说,就是 n 的精确平方根的上限。对于正整数 n,可以使用 a = 1 + isqrt(n - 1) 进行计算。

在 3.8 版本加入。

math.lcm(*integers)

返回指定整数参数的最小公倍数。如果所有参数都不为零,则返回值为所有参数的最小正整数倍数。如果任何参数为零,则返回值为 0lcm() 不带参数时返回 1

在 3.9 版本中新增。

math.perm(n, k=None)

返回从 n 个项目中选择 k 个项目而无需重复且考虑顺序的方法数。

k <= n 时,计算结果为 n! / (n - k)!;当 k > n 时,计算结果为零。

如果未指定 kkNone,则 k 默认为 n,函数返回 n!

如果任一参数不是整数,则引发 TypeError。如果任一参数为负数,则引发 ValueError

在 3.8 版本加入。

浮点算术

math.ceil(x)

返回 x 的上限,即大于或等于 x 的最小整数。如果 x 不是浮点数,则委托给 x.__ceil__,它应该返回一个 Integral 值。

math.fabs(x)

返回 x 的绝对值。

math.floor(x)

返回 x 的下限,即小于或等于 x 的最大整数。如果 x 不是浮点数,则委托给 x.__floor__,它应该返回一个 Integral 值。

math.fma(x, y, z)

融合乘加运算。返回 (x * y) + z,计算过程如同具有无限精度和范围,然后单次舍入到 float 格式。此操作通常比直接表达式 (x * y) + z 提供更好的精度。

此函数遵循 IEEE 754 标准中描述的 fusedMultiplyAdd 操作规范。该标准将一种情况的实现定义为 fma(0, inf, nan)fma(inf, 0, nan) 的结果。在这些情况下,math.fma 返回 NaN,并且不引发任何异常。

在 3.13 版本加入。

math.fmod(x, y)

返回 x / y 的浮点余数,由平台 C 库函数 fmod(x, y) 定义。请注意,Python 表达式 x % y 可能不会返回相同的结果。C 标准的意图是 fmod(x, y) 严格地(数学上;无限精度)等于 x - n*y,其中 n 是一个整数,使得结果与 x 具有相同的符号且大小小于 abs(y)。Python 的 x % y 返回一个与 y 具有相同符号的结果,并且对于浮点参数可能无法精确计算。例如,fmod(-1e-100, 1e100)-1e-100,但 Python 的 -1e-100 % 1e100 的结果是 1e100-1e-100,它无法精确表示为浮点数,并舍入到令人惊讶的 1e100。因此,在使用浮点数时,通常首选函数 fmod(),而使用整数时,首选 Python 的 x % y

math.modf(x)

返回 x 的小数部分和整数部分。两个结果都带有 x 的符号,并且都是浮点数。

请注意,modf() 的调用/返回模式与其 C 等效函数不同:它接受一个参数并返回一对值,而不是通过“输出参数”(Python 中没有这样的东西)返回其第二个返回值。

math.remainder(x, y)

返回 x 相对于 y 的 IEEE 754 风格的余数。对于有限的 x 和有限的非零 y,这是差 x - n*y,其中 n 是最接近商 x / y 精确值的整数。如果 x / y 恰好位于两个连续整数的中间,则使用最接近的 偶数 整数作为 n。因此,余数 r = remainder(x, y) 始终满足 abs(r) <= 0.5 * abs(y)

特殊情况遵循 IEEE 754 标准:特别是,对于任何有限的 xremainder(x, math.inf)x;对于任何非 NaN 的 xremainder(x, 0)remainder(math.inf, x) 会引发 ValueError。如果余数运算的结果为零,则该零将与 x 具有相同的符号。

在使用 IEEE 754 二进制浮点数的平台上,此操作的结果总是可以精确表示的:不会引入舍入误差。

在 3.7 版本加入。

math.trunc(x)

返回 x 移除小数部分后的整数部分。这会向 0 舍入:trunc() 对于正 x 等价于 floor(),对于负 x 等价于 ceil()。如果 x 不是浮点数,则委托给 x.__trunc__,它应该返回一个 Integral 值。

对于 ceil()floor()modf() 函数,请注意,足够大的所有浮点数都是精确整数。Python 浮点数通常不超过 53 位精度(与平台 C 双精度类型相同),在这种情况下,任何 abs(x) >= 2**52 的浮点数 x 必然没有小数位。

浮点操作函数

math.copysign(x, y)

返回一个浮点数,其大小(绝对值)与 x 相同,但符号与 y 相同。在支持带符号零的平台上,copysign(1.0, -0.0) 返回 -1.0

math.frexp(x)

返回 x 的尾数和指数作为对 (m, e)m 是一个浮点数,e 是一个整数,使得 x == m * 2**e 精确成立。如果 x 为零,则返回 (0.0, 0),否则 0.5 <= abs(m) < 1。这用于以可移植的方式“分解”浮点数的内部表示。

请注意,frexp() 的调用/返回模式与其 C 等效函数不同:它接受一个参数并返回一对值,而不是通过“输出参数”(Python 中没有这样的东西)返回其第二个返回值。

math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

如果值 ab 彼此接近则返回 True,否则返回 False

两个值是否被视为接近取决于给定的绝对容差和相对容差。如果没有发生错误,结果将是:abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

rel_tol 是相对容差——它是 ab 之间允许的最大差值,相对于 ab 的较大绝对值。例如,要设置 5% 的容差,请传递 rel_tol=0.05。默认容差为 1e-09,它确保两个值在约 9 个十进制数字内相同。rel_tol 必须是非负数且小于 1.0

abs_tol 是绝对容差;它默认为 0.0 并且必须是非负数。当将 x0.0 比较时,isclose(x, 0) 计算为 abs(x) <= rel_tol  * abs(x),对于任何非零 x 和小于 1.0rel_tol,这都是 False。因此,在调用中添加适当的正 abs_tol 参数。

IEEE 754 特殊值 NaNinf-inf 将根据 IEEE 规则处理。具体来说,NaN 不被认为与任何其他值(包括 NaN)接近。inf-inf 只被认为与它们自己接近。

在 3.5 版本加入。

参见

PEP 485 – 用于测试近似相等的函数

math.isfinite(x)

如果 x 既不是无穷大也不是 NaN,则返回 True,否则返回 False。(请注意,0.0 视为有限。)

在 3.2 版本加入。

math.isinf(x)

如果 x 是正无穷大或负无穷大,则返回 True,否则返回 False

math.isnan(x)

如果 x 是 NaN(非数字),则返回 True,否则返回 False

math.ldexp(x, i)

返回 x * (2**i)。这实质上是函数 frexp() 的逆运算。

math.nextafter(x, y, steps=1)

返回浮点值 steps 步后 x 趋向 y

如果 x 等于 y,则返回 y,除非 steps 为零。

示例:

  • math.nextafter(x, math.inf) 向上:趋向正无穷大。

  • math.nextafter(x, -math.inf) 向下:趋向负无穷大。

  • math.nextafter(x, 0.0) 趋向零。

  • math.nextafter(x, math.copysign(math.inf, x)) 远离零。

另请参阅 math.ulp()

在 3.9 版本中新增。

版本 3.12 中有改变: 添加了 steps 参数。

math.ulp(x)

返回浮点数 x 的最低有效位的数值。

  • 如果 x 是 NaN(非数字),则返回 x

  • 如果 x 为负数,则返回 ulp(-x)

  • 如果 x 是正无穷大,则返回 x

  • 如果 x 等于零,则返回最小的正 非规范化 可表示浮点数(小于最小正 规范化 浮点数,sys.float_info.min)。

  • 如果 x 等于最大的正可表示浮点数,则返回 x 的最低有效位的数值,使得小于 x 的第一个浮点数是 x - ulp(x)

  • 否则(x 是一个正有限数),返回 x 的最低有效位的数值,使得大于 x 的第一个浮点数是 x + ulp(x)

ULP 代表“Unit in the Last Place”(最低有效位单元)。

另请参阅 math.nextafter()sys.float_info.epsilon

在 3.9 版本中新增。

幂、指数和对数函数

math.cbrt(x)

返回 x 的立方根。

在 3.11 版本中新增。

math.exp(x)

返回 ex 次幂,其中 e = 2.718281… 是自然对数的底数。这通常比 math.e ** xpow(math.e, x) 更精确。

math.exp2(x)

返回 2x 次幂。

在 3.11 版本中新增。

math.expm1(x)

返回 ex 次幂,减去 1。这里 e 是自然对数的底数。对于小的浮点数 xexp(x) - 1 中的减法可能导致显著的精度损失expm1() 函数提供了一种以全精度计算此量的方法。

>>> from math import exp, expm1
>>> exp(1e-5) - 1  # gives result accurate to 11 places
1.0000050000069649e-05
>>> expm1(1e-5)    # result accurate to full precision
1.0000050000166668e-05

在 3.2 版本加入。

math.log(x[, base])

带一个参数时,返回 x 的自然对数(以 e 为底)。

带两个参数时,返回 x 以给定 base 为底的对数,计算方式为 log(x)/log(base)

math.log1p(x)

返回 1+x 的自然对数(以 e 为底)。结果的计算方式对于接近零的 x 是精确的。

math.log2(x)

返回 x 的以 2 为底的对数。这通常比 log(x, 2) 更精确。

在 3.3 版本加入。

参见

int.bit_length() 返回表示一个整数所需的位数,不包括符号和前导零。

math.log10(x)

返回 x 的以 10 为底的对数。这通常比 log(x, 10) 更精确。

math.pow(x, y)

返回 xy 次幂。特殊情况尽可能遵循 IEEE 754 标准。特别是,pow(1.0, x)pow(x, 0.0) 始终返回 1.0,即使 x 是零或 NaN。如果 xy 都是有限的,x 为负数,且 y 不是整数,则 pow(x, y) 未定义,并引发 ValueError

与内置的 ** 运算符不同,math.pow() 将其两个参数都转换为 float 类型。对于精确整数幂的计算,请使用 ** 或内置的 pow() 函数。

版本 3.11 中有改变: 特殊情况 pow(0.0, -inf)pow(-0.0, -inf) 已更改为返回 inf 而不是引发 ValueError,以与 IEEE 754 保持一致。

math.sqrt(x)

返回 x 的平方根。

求和与乘积函数

math.dist(p, q)

返回两个点 pq 之间的欧几里得距离,每个点都作为坐标序列(或可迭代对象)给出。这两个点必须具有相同的维度。

大致相当于:

sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))

在 3.8 版本加入。

math.fsum(iterable)

返回可迭代对象中值的精确浮点和。通过跟踪多个中间部分和来避免精度损失。

该算法的准确性取决于 IEEE-754 算术保证以及舍入模式通常为“四舍五入到最近的偶数”的情况。在某些非 Windows 构建上,底层的 C 库使用扩展精度加法,可能会偶尔对中间和进行二次舍入,导致其最低有效位出现偏差。

有关进一步讨论和两种替代方法,请参阅 ASPN cookbook 中的精确浮点求和食谱

math.hypot(*coordinates)

返回欧几里得范数,sqrt(sum(x**2 for x in coordinates))。这是从原点到坐标给定点的向量的长度。

对于二维点 (x, y),这等价于使用勾股定理计算直角三角形的斜边,sqrt(x*x + y*y)

版本 3.8 中有改变: 添加了对 n 维点的支持。以前只支持二维情况。

版本 3.10 中有改变: 改进了算法的精度,使最大误差小于 1 ulp(最低有效位单元)。更常见的是,结果几乎总是正确舍入到 1/2 ulp 以内。

math.prod(iterable, *, start=1)

计算输入 iterable 中所有元素的乘积。乘积的默认 start 值为 1

当可迭代对象为空时,返回起始值。此函数专门用于数值,并且可能会拒绝非数值类型。

在 3.8 版本加入。

math.sumprod(p, q)

返回两个可迭代对象 pq 中值的乘积之和。

如果输入长度不同,则引发 ValueError

大致相当于:

sum(map(operator.mul, p, q, strict=True))

对于浮点数和混合整数/浮点数输入,中间乘积和求和以扩展精度计算。

3.12 新版功能.

角度转换

math.degrees(x)

将角度 x 从弧度转换为度数。

math.radians(x)

将角度 x 从度数转换为弧度。

三角函数

math.acos(x)

返回 x 的反余弦,以弧度表示。结果介于 0pi 之间。

math.asin(x)

返回 x 的反正弦,以弧度表示。结果介于 -pi/2pi/2 之间。

math.atan(x)

返回 x 的反正切,以弧度表示。结果介于 -pi/2pi/2 之间。

math.atan2(y, x)

返回 atan(y / x),以弧度表示。结果介于 -pipi 之间。平面上从原点到点 (x, y) 的向量与正 X 轴形成此角度。atan2() 的作用是它知道两个输入的符号,因此可以计算角度的正确象限。例如,atan(1)atan2(1, 1) 都是 pi/4,但 atan2(-1, -1)-3*pi/4

math.cos(x)

返回 x 弧度的余弦。

math.sin(x)

返回 x 弧度的正弦。

math.tan(x)

返回 x 弧度的正切。

双曲函数

双曲函数 是基于双曲线而非圆的三角函数的类似物。

math.acosh(x)

返回 x 的反双曲余弦。

math.asinh(x)

返回 x 的反双曲正弦。

math.atanh(x)

返回 x 的反双曲正切。

math.cosh(x)

返回 x 的双曲余弦。

math.sinh(x)

返回 x 的双曲正弦。

math.tanh(x)

返回 x 的双曲正切。

特殊函数

math.erf(x)

返回 x 处的误差函数

erf() 函数可用于计算传统的统计函数,例如累积标准正态分布

def phi(x):
    'Cumulative distribution function for the standard normal distribution'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0

在 3.2 版本加入。

math.erfc(x)

返回 x 处的互补误差函数。互补误差函数 定义为 1.0 - erf(x)。它用于 x 值较大时,此时从 1 中减去会导致精度损失

在 3.2 版本加入。

math.gamma(x)

返回 x 处的伽马函数

在 3.2 版本加入。

math.lgamma(x)

返回 x 处伽马函数绝对值的自然对数。

在 3.2 版本加入。

常量

math.pi

数学常数 π = 3.141592…,精确到可用精度。

math.e

数学常数 e = 2.718281…,精确到可用精度。

math.tau

数学常数 τ = 6.283185…,精确到可用精度。Tau 是一个圆周常数,等于 2π,是圆周长与其半径之比。要了解更多关于 Tau 的信息,请观看 Vi Hart 的视频 Pi is (still) Wrong,并通过吃两倍的派来庆祝Tau 日

在 3.6 版本加入。

math.inf

一个浮点正无穷大。(对于负无穷大,使用 -math.inf。)等同于 float('inf') 的输出。

在 3.5 版本加入。

math.nan

一个浮点数“不是数字”(NaN)的值。等同于 float('nan') 的输出。由于 IEEE-754 标准 的要求,math.nanfloat('nan') 不被认为等于任何其他数值,包括它们自身。要检查一个数字是否是 NaN,请使用 isnan() 函数来测试 NaN,而不是使用 is==。示例

>>> import math
>>> math.nan == math.nan
False
>>> float('nan') == float('nan')
False
>>> math.isnan(math.nan)
True
>>> math.isnan(float('nan'))
True

在 3.5 版本加入。

版本 3.11 中有改变: 现在总是可用。

CPython 实现细节:math 模块主要由平台 C 数学库函数的薄包装组成。在异常情况下的行为在适当时遵循 C99 标准的附录 F。当前的实现将对 sqrt(-1.0)log(0.0) 等无效操作(C99 附录 F 建议发出无效操作或除以零信号)引发 ValueError,并对溢出的结果(例如 exp(1000.0))引发 OverflowError。除非一个或多个输入参数是 NaN,否则上述任何函数都不会返回 NaN;在这种情况下,大多数函数将返回 NaN,但(再次遵循 C99 附录 F)此规则也有一些例外,例如 pow(float('nan'), 0.0)hypot(float('nan'), float('inf'))

请注意,Python 不会努力区分信令 NaN 和静默 NaN,并且信令 NaN 的行为未指定。典型的行为是将所有 NaN 视为静默 NaN。

参见

模块 cmath

许多这些函数的复数版本。