簡體   English   中英

如何在不使用 math.log 的情況下在 Python 中計算對數

[英]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) 通過閾值進行比較:

  1. 您可以使用Numpy ,它默認在float64上運行,並且是用於數值計算的最快的 Python 庫(甚至比 C 還快)
  2. 例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM