我希望計算一個非常接近 1 但不完全是 1 的值的自然對數。
例如,np.log(1 1e-22)是 0 而不是一些非零值。但是,np.log(1 1e-13)不為零,并且計算為9.992007221625909e-14。
在使用 numpy 函式與使用dtypeas定義 numpy 陣列時,我如何理解這種精度權衡np.longdouble?
我正在使用的系統上 numpy (v1.22.2) 的浮動精度資訊:
>>> np.finfo(np.longdouble)
finfo(resolution=1e-15, min=-1.7976931348623157e 308, max=1.7976931348623157e 308, dtype=float64)
>>> 1 np.finfo(np.longdouble).eps
1.0000000000000002
uj5u.com熱心網友回復:
使用 Numpy 完成@yut23 的良好解決方案。如果您需要處理不適合 Numpy 定義的本機型別的非常小的浮點數或接近 1 且精度超過 ~10 位的數字,則可以使用decimal 包。它比本機浮點數慢,但它可以為您提供任意精度。問題是它不直接支持自然對數(即log)函式,因為它基于超越歐拉數(即e),幾乎不能以任意精度計算(至少在精度很大時)。幸運的是,您可以從基于 10 的對數和基于現有數字資料庫(如此類)的預先計算的歐拉數計算自然對數(我想 10000 位數字應該足以滿足您的需求;))。這是一個例子:
import decimal
from decimal import Decimal
decimal.setcontext(decimal.Context(prec=100)) # 100 digits of precision
e = Decimal('2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516643')
result = (Decimal("1") Decimal("1e-13")).log10() / e.log10()
# result = 9.999999999999500000000000033333333333330833333333333533333333333316666666666668095238095237970238087E-14
的精度為result99 位(只有最后一位不正確)。
uj5u.com熱心網友回復:
對于實際使用,請查看np.log1p(x),它的計算log(1 x)沒有來自 的舍入誤差1 x。從檔案:
對于實值輸入,log1p 也適用于 x 小到 1 x == 1 的浮點精度。
即使看似有效的示例也log(1 1e-13)與 64 位浮點數的第 3 位真實值和 128 位浮點數的第 6 位真實值不同(真實值來自WolframAlpha):
>>> (1 1e-13) - 1
9.992007221626409e-14
>>> np.log(1 1e-13)
9.992007221625909e-14
>>> np.log(1 np.array(1e-13, dtype=np.float128))
9.999997791637127032e-14
>>> np.log1p(1e-13)
9.9999999999995e-14
>>> 9.999999999999500000000000033333333333330833333333333533333*10**-14
9.9999999999995e-14
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475082.html
