2017-07-27 3 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を返します。これは正しいです。しかし、それ以降はFalseになります。 4*4*4=64または5*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 
関連する問題