HOWTO · Python
在 Python 中使用欧拉数
在 Python 中正确使用 math.e、math.exp() 和 numpy.exp() 处理欧拉数。
本页内容
需要欧拉数的浮点值时使用 math.e,需要计算 e 的一个标量指数幂时使用 math.exp(x),需要对数组中的每个元素执行该计算时使用 numpy.exp(values)。math 模块属于 Python 标准库;NumPy 是数组运算的可选依赖。这些选择取决于输入形状和用途,而不是代表普遍适用的速度排名。
通常写作 e 的欧拉数是自然对数的底。Python 将它存储为二进制浮点值,因此打印格式可以改变显示结果,却不会改变后续计算使用的值。
需要常数时读取 math.e
从 math 导入 e 即可直接读取该常数。这适用于标签、公式,或明确需要底值的计算。输出是测试运行时中 Python float 的常规表示形式。
from math import e
print(e)
2.718281828459045
只在展示结果时使用格式化。例如,f"{e:.5f}" 会显示 2.71828,但不会提高已存储浮点数的精度。计算时保留未格式化的值,只有读者、文件或界面需要固定小数位数时才进行舍入。
使用 math.exp() 计算单个标量指数
对于标量 x,使用 math.exp(x) 计算 e 的 x 次幂。它清楚地表达了操作,Python 文档也说明它通常比写成 math.e ** x 更准确。math.expm1(x) 用于特定表达式 exp(x) - 1,当 x 非常接近零时可以避免损失有效精度。
import math
print(math.exp(3))
print(math.expm1(1e-16))
20.085536923187668
1e-16
第一行计算 e 的三次方。第二行展示 expm1 产生的小结果;从 math.exp(1e-16) 中减去 1 时,信息可能在减法完成前就被舍入掉。
math.exp() 受 Python float 取值范围的限制。足够大的有限指数会引发 OverflowError,因此当输入可能没有上限时应处理这一边界,不要假设每个指数都有可表示的结果。
import math
try:
math.exp(1000)
except OverflowError as error:
print(type(error).__name__)
OverflowError
如果应用预期会发生溢出,请验证输入范围、改变数学表示,或采用适合该领域的数值方法。溢出属于程序预期行为时,捕获异常很有用;但不要用它掩盖意外的输入错误。
使用 numpy.exp() 计算数组值
numpy.exp() 是按元素计算的通用函数。当每个指数都需要对应结果时,应向它传入类似数组的集合。如果尚未安装 NumPy,请先使用项目通常的依赖工具安装;标准库中的 math 模块不提供数组运算。
import numpy as np
exponents = np.array([0.0, 1.0, 2.0])
print(np.exp(exponents))
[1. 2.71828183 7.3890561 ]
返回数组的形状与输入相同,其中每个元素都是以该输入元素为指数的 e 次幂。单个标量使用 math.exp(),需要数组语义时使用 numpy.exp();NumPy 也接受标量,但仅为一次标量计算而导入它没有必要。
根据输入选择方法
读取常数使用 math.e,计算单个标量指数使用 math.exp(),进行数组逐元素计算使用 numpy.exp()。当接近零时需要得到 exp(x) - 1,请使用 math.expm1()。这些 API 都使用有限浮点值:格式化会影响显示,过大的指数结果可能无法放入 float。完整 API 细节请参阅官方的 Python math 文档 和 NumPy exp 文档。