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