[英]how to compute logarithms in Python not using math.log
在我的代碼的 while 循環中,while 會中斷,因為
>>> 3<=abs(math.log(1000,10))
False
但是,當然,以 10 為底的 1000 的對數正好是 3,所以我相信條件應該有效......
但實際上我有這個:
>>> abs(math.log(1000,10))
2.9999999999999996
所以我想提出任何建議:是否有對結果進行四舍五入的“最佳實踐”,或者是否有更智能的方法來計算對數? 非常感謝!
對於基數 10,您應該使用:
math.log10(x)
它返回 x 的以 10 為底的對數。 這通常比 log(x, 10) 更准確。
也許您可以使用容差來解釋計算錯誤。 例如這樣的事情(您可以根據所需的精度調整所需的 10 次冪)
abs(math.log(1000,10))-3 >= -1e-6
使用 numpy 我也有np.log10(1000) = 3.0
。 您可以將其用作替代方案。
您會看到浮點數值的不精確性,這是您無法完全規避的計算系統的基本限制。 兩種標准做法是:(1) 增加數字精度(例如float64
),或 (2) 通過閾值進行比較:
float64
上運行,並且是用於數值計算的最快的 Python 庫(甚至比 C 還快)abs(math.log(1000,10) - eps)
,其中eps
(epsilon) 是一些小數(例如1e-7
) 事實上,如果一次比較多個值(向量、矩陣),Numpy 有一個方便的方法: np.allclose
。 要與 (2) 中的比較,請設置rtol=0
,然后使用atol
; 例子:
vec1 = np.array([1, 1, 1, 1])
vec2 = np.array([.33, .33, .33, .33])
print(np.allclose(vec1/3, vec2, rtol=0, atol=0.01)) # True
print(np.allclose(vec1/3, vec2, rtol=0, atol=0.001)) # False
如何查看真實值: (1e-5 + 1e-5 + 1.) == 1.00002
將顯示True
,但它不是; Python 會自動為您簡化控制台記錄的表示。 要查看實際數值,請使用 Python 的format
:
print(format(1e-5 + 1e-5 + 1., '.32f'))
# print(format(1e-5 + 1e-5 + 1., '.32f'))
1.00001999999999990897947554913117
^ 這是存儲在內存中的真實值,它是1.00002
在運行==
之前轉換為的值,這就是它顯示True
。
您可以使用math.isclose
檢查一個值是否接近另一個值。
import math
print(math.isclose(3,math.log(1000,10)))
你可以像這樣改變你的條件
logvalue = math.log(1000,10)
print(3 <= logvalue or math.isclose(3,logvalue))
並獲得True
作為輸出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.