math
— 数学函数¶
此模块提供了对 C 标准定义的数学函数的访问。
这些函数不能用于复数;如果需要支持复数,请使用 cmath
模块中相同名称的函数。 之所以要区分支持复数的函数和不支持复数的函数,是因为大多数用户不想学习理解复数所需的那么多数学知识。接收到异常而不是复数结果,可以更早地检测到用作参数的意外复数,以便程序员可以确定它最初是如何以及为什么生成的。
此模块提供以下函数。 除非另有明确说明,否则所有返回值均为浮点数。
数论与表示函数¶
- math.ceil(x)¶
返回 x 的上限,即大于或等于 x 的最小整数。 如果 x 不是浮点数,则委托给
x.__ceil__
,它应该返回一个Integral
值。
- math.comb(n, k)¶
返回从 n 个项中选取 k 个项的方法数,不重复且无序。
当
k <= n
时,其值为n! / (k! * (n - k)!)
,当k > n
时,其值为零。也称为二项式系数,因为它等价于
(1 + x)ⁿ
的多项式展开式中第 k 项的系数。如果任一参数不是整数,则引发
TypeError
。 如果任一参数为负数,则引发ValueError
。3.8 版新增。
- math.copysign(x, y)¶
返回一个浮点数,其大小(绝对值)为 x,但符号为 y。 在支持带符号零点的平台上,
copysign(1.0, -0.0)
返回 -1.0。
- math.fabs(x)¶
返回 x 的绝对值。
- math.factorial(n)¶
以整数形式返回 n 的阶乘。 如果 n 不是整数或为负数,则引发
ValueError
。3.9 版后已弃用: 不建议接受具有整数值的浮点数(如
5.0
)。
- math.floor(x)¶
返回 x 的下限,即小于或等于 x 的最大整数。 如果 x 不是浮点数,则委托给
x.__floor__
,它应该返回一个Integral
值。
- math.fmod(x, y)¶
返回
fmod(x, y)
,由平台 C 库定义。 请注意,Python 表达式x % y
可能不会返回相同的结果。 C 标准的意图是,对于某个整数 n,fmod(x, y)
恰好(数学上;无限精度)等于x - n*y
,这样结果的符号与 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.frexp(x)¶
以对
(m, e)
的形式返回 x 的尾数和指数。 m 是一个浮点数,e 是一个整数,使得x == m * 2**e
精确成立。 如果 x 为零,则返回(0.0, 0)
,否则0.5 <= abs(m) < 1
。 这用于以可移植的方式“分离”浮点数的内部表示。
- math.fsum(iterable)¶
返回可迭代对象中值的精确浮点数之和。 通过跟踪多个中间部分和来避免精度损失。
该算法的精度取决于 IEEE-754 算术保证以及舍入模式为半偶数的典型情况。在一些非 Windows 版本中,底层 C 库使用扩展精度加法,并且偶尔会对中间和进行双重舍入,导致其最低有效位出现偏差。
有关进一步讨论和两种替代方法,请参阅 ASPN 食谱,了解精确的浮点求和。
- math.gcd(*integers)¶
返回指定整数参数的最大公约数。如果任何参数不为零,则返回值是所有参数的最大公约数。如果所有参数都为零,则返回值为
0
。不带参数的gcd()
返回0
。3.5 版新增。
3.9 版更改: 添加了对任意数量参数的支持。以前只支持两个参数。
- math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)¶
如果值 *a* 和 *b* 相近,则返回
True
,否则返回False
。两个值是否被认为相近是根据给定的绝对和相对容差来确定的。
*rel_tol* 是相对容差 - 它是 *a* 和 *b* 之间允许的最大差值,相对于 *a* 或 *b* 的较大绝对值。例如,要设置 5% 的容差,请传递
rel_tol=0.05
。默认容差为1e-09
,这确保了这两个值在约 9 位小数以内是相同的。*rel_tol* 必须大于零。*abs_tol* 是最小绝对容差 - 对于接近零的比较很有用。*abs_tol* 必须至少为零。
如果没有错误发生,结果将是:
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
。IEEE 754 特殊值
NaN
、inf
和-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.isqrt(n)¶
返回非负整数 *n* 的整数平方根。这是 *n* 的精确平方根的向下取整,或者等效地说是最大的整数 *a*,使得 *a*² ≤ *n*。
对于某些应用,使用最小的整数 *a* 使得 *n* ≤ *a*² 可能更方便,或者换句话说,使用 *n* 的精确平方根的向上取整。对于正数 *n*,可以使用
a = 1 + isqrt(n - 1)
来计算。3.8 版新增。
- math.lcm(*integers)¶
返回指定整数参数的最小公倍数。如果所有参数都不为零,则返回值是所有参数的最小公倍数。如果任何参数为零,则返回值为
0
。不带参数的lcm()
返回1
。3.9 版新增。
- math.modf(x)¶
返回 *x* 的小数部分和整数部分。两个结果都带有 *x* 的符号,并且都是浮点数。
- math.nextafter(x, y, steps=1)¶
返回 *x* 在 *steps* 步后朝向 *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.perm(n, k=None)¶
返回从 n 个项目中选择 k 个项目(不重复且有序)的方式数。
当
k <= n
时,结果为n! / (n - k)!
,当k > n
时,结果为零。如果未指定 k 或 k 为
None
,则 k 默认为 n,函数返回n!
。如果任一参数不是整数,则引发
TypeError
。 如果任一参数为负数,则引发ValueError
。3.8 版新增。
- math.prod(iterable, *, start=1)¶
计算输入 iterable 中所有元素的乘积。乘积的默认 start 值为
1
。当 iterable 为空时,返回起始值。此函数专门用于数值,可能会拒绝非数值类型。
3.8 版新增。
- 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:特别是,对于任何有限 x,
remainder(x, math.inf)
为 x,并且对于任何非 NaN x,remainder(x, 0)
和remainder(math.inf, x)
会引发ValueError
。如果余数运算的结果为零,则该零的符号与 x 相同。在使用 IEEE 754 二进制浮点数的平台上,此操作的结果始终是精确可表示的:不会引入舍入误差。
3.7 版新增。
- math.sumprod(p, q)¶
返回两个可迭代对象 p 和 q 中的值的乘积之和。
如果输入的长度不同,则引发
ValueError
。大致相当于
sum(itertools.starmap(operator.mul, zip(p, q, strict=True)))
对于浮点数和混合整数/浮点数输入,中间乘积和总和使用扩展精度计算。
3.12 版新增。
- math.trunc(x)¶
返回移除小数部分后的 x,保留整数部分。这将向 0 进行舍入:对于正 x,
trunc()
等效于floor()
,对于负 x,等效于ceil()
。如果 x 不是浮点数,则委托给x.__trunc__
,后者应返回一个Integral
值。
- 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 代表“最后一位的单位”。
另请参阅
math.nextafter()
和sys.float_info.epsilon
。3.9 版新增。
请注意,frexp()
和 modf()
的调用/返回模式与其 C 语言对应函数不同:它们接受一个参数并返回一对值,而不是通过“输出参数”(Python 中没有这种东西)返回其第二个返回值。
对于 ceil()
、floor()
和 modf()
函数,请注意,*所有* 足够大的浮点数都是精确的整数。Python 浮点数通常最多携带 53 位精度(与平台 C 双精度类型相同),在这种情况下,任何满足 abs(x) >= 2**52
的浮点数 *x* 必然没有小数位。
幂函数和对数函数¶
- math.cbrt(x)¶
返回 *x* 的立方根。
在 3.11 版本中添加。
- math.exp(x)¶
返回 *e* 的 *x* 次幂,其中 *e* = 2.718281… 是自然对数的底数。这通常比
math.e ** x
或pow(math.e, x)
更准确。
- math.exp2(x)¶
返回 *2* 的 *x* 次幂。
在 3.11 版本中添加。
- math.expm1(x)¶
返回 *e* 的 *x* 次幂,减 1。这里 *e* 是自然对数的底数。对于较小的浮点数 *x*,
exp(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)¶
返回
x
的y
次幂。特殊情况尽可能遵循 IEEE 754 标准。特别是,pow(1.0, x)
和pow(x, 0.0)
总是返回1.0
,即使x
是零或 NaN。如果x
和y
都是有限的,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.acos(x)¶
返回 *x* 的反余弦值,以弧度为单位。结果介于
0
和pi
之间。
- math.asin(x)¶
返回 *x* 的反正弦值,以弧度为单位。结果介于
-pi/2
和pi/2
之间。
- math.atan(x)¶
返回 *x* 的反正切值,以弧度为单位。结果介于
-pi/2
和pi/2
之间。
- math.atan2(y, x)¶
返回
atan(y / x)
,以弧度为单位。结果介于-pi
和pi
之间。从原点到点(x, y)
的平面向量与正 X 轴形成此角度。atan2()
的意义在于它知道两个输入的符号,因此它可以计算出角度所在的正确象限。例如,atan(1)
和atan2(1, 1)
都是pi/4
,但atan2(-1, -1)
是-3*pi/4
。
- math.cos(x)¶
返回 x 弧度的余弦值。
- math.dist(p, q)¶
返回两点 p 和 q 之间的欧几里得距离,每个点都以坐标序列(或可迭代对象)给出。两点必须具有相同的维度。
大致相当于
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
3.8 版新增。
- 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.sin(x)¶
返回 x 弧度的正弦值。
- math.tan(x)¶
返回 x 弧度的正切值。
角度转换¶
- math.degrees(x)¶
将角度 x 从弧度转换为度数。
- math.radians(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.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.nan
和float('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)
等无效操作引发 ValueError
(其中 C99 附录 F 建议发出无效操作或除以零的信号),并针对溢出的结果(例如,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
许多这些函数的复数版本。