2017-07-27 112 views
3

我的一個簡單的問題是創建一個函數,確定是否可以將某個給定的n編號爲a^n,即我需要檢查N^(1/n)是否是整體數。不知怎的,這個功能產生錯誤的結果:Python:函數來確定數字是正方形,立方體等

def is_power(N, n): 
    r = float(N) ** (1./float(n)) 
    return r.is_integer() 

對於n=2它的工作原理。

對於n=3和N = 1,8,27,函數產生True,這是正確的。但從那時起,假,例如對於4*4*4=645*5*5=125。我如何創建一個可以找到正方形/立方體/等的數字的工作函數?

+0

的可能的複製[是浮點運算壞了嗎?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+0

浮點運算是不精確的。 –

+0

謝謝。如何創建一個不會因浮點運算問題而失敗的函數? –

回答

6

浮點運算不準確 - 請參閱Is floating point math broken?

因此,請使用精確整數數學來檢查您的答案。輪到r到最接近的整數,然後查看電源是否工作。這個Python 3代碼刪除了一些冗餘的類型轉換。對於Python 2,將r的計算包裝爲int()類型轉換(對於Python 3不需要)。

def is_power(N, n): 
    r = round(N ** (1.0/n)) 
    return r**n == N