2017-07-27 77 views
1

爲了找到在一定基數的數字的位數,我試圖寫該行:掌握日誌的地板上舍入誤差在Python

numdigits = math.floor(math.log(num, base)) + 1 

其中math.log(num, base)相當於math.log(num)/math.log(base)

但是,在這兩種情況下,這有時會得到錯誤的位數。這是因爲math.log的答案是浮點數,因此精度有限。例如,計算的3486784401(3^20)底數3時:

>>> math.log(3486784401, 3) 
19.999999999999996 

趁着這個地板將給予19,而正確答案是20。我明白,這是因爲道路浮點數字以二進制表示,但我想知道是否有解決此問題的方法。

有沒有一種方法可以寫出一個函數,以100%的精度給出任何基底的對數底線?

+0

您可以使用'sympy.log'進行精確計算。 –

+0

@YakymPirozhenko謝謝!你知道這是如何工作的嗎?它的速度有多快? – Yaxlat

回答

0

是的,有多種方式。

  1. 您可以像您在問題中那樣評估數位數。然後你可以測試你的結果通過計算base**result(整數,所以你得到一個確切的結果),看看它是如何比較你的原始參數。您調整result向上或向下調整1並再次測試,直到您確定您的最終結果是正確的。您最多需要3次測試。

  2. 同樣,您可以跳過log測試,只評估base的功率,直到它達到或超過您的參數。這使得事物完全保持整數,但會更耗時。

  3. 當然,另一種方法是實際轉換到所需的基地,然後檢查數字的位數。當然這更加耗時。