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 文档。