簡體   English   中英

處理Python數學運算的准確性

[英]Dealing with accuracy in Python math operations

我試圖編寫一個簡單的程序來確定輸入整數是否為2的冪。

我有以下代碼。 對於n=5368709125368709122^29 ),測試用例將失敗。

我試圖與在格式化的數量, format(y,'12g')的輸出接近0但不等於03.43965 e-07

我該如何克服這個數字問題?

    s= math.log(n,2)
    [sh,y]=divmod(s,1)

    if y!=0:
    #if format(yu,'20f')!=format(0,'20f') :
        return False
    else:
        return True

如果你想比較浮點數並允許一點浮點不准確,你通常會檢查它們是否在彼此的某個允許距離內( if abs(xy) < epsilon )。

但是,如果你想知道一個整數是2的冪,你可以這樣做:

def ispoweroftwo(n):
    return (n>0 and (n&-n)==n)

這符合簽名數字的二進制補碼表示規則。

>>> ispoweroftwo(536870911)
False
>>> ispoweroftwo(536870912)
True

比較浮點數是否相等的方法是abs(a - b) < tolerance ,其中tolerance = 1e-6或一些類似的小數。 在你的情況下,它只是abs(y) < 1e-6

有關更多信息,請查看此處的准確性或熱門的SO問題

如果你需要精確度並且你不想自己重新發明精確度輪,那么你可以看一下NumPy ,它是為這種目的而精確設計的(准確地對任何類型的大量數字進行復雜的數學運算)。

import numpy as np

x = np.array([0, 1, 2, 2**4, 536870912])
np.log2(x)

# array([-Inf,   0.,   1.,   4., 29.])

請參閱np.log2() 文檔快速入門教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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