2017-02-20 5 views
0

M=N**2ここで、Nは整数であると考えています。 numpy.sqrt(M)はfloat(実際にはnumpy.float64)を返します。`int(numpy.sqrt(N))`の安全性

私が原因int(numpy.sqrt(M))N-1になり、その場合、数値精度の問題にN-10**(-16)、たとえば、それは返す場合があるかもしれないことを想像できます。

しかし、私のテストではN==numpy.sqrt(M)にはTrueが返されているので、この近似は起こっていないようです。

Mが完璧な広場である場合、int(numpy.sqrt(M))は確かに正確であると仮定することはできますか?もしそうなら、ボーナスのために、バックグラウンドで何が起こっているのですか?あなたが使用することができ1E-15で整数を見逃さないようにするに

+1

いいえ、それはのfloat64であれば、それはどのおよそ〜20ヶ所に正しくなります*たくさんありますが、完璧ではありません。 int sqrtを使用する方法があります。 –

+0

http://stackoverflow.com/questions/15390858/weird-behaviour-of-np-sqrt-for-large-integersおよびhttp://stackoverflow.com/questionsを参照してください。/15390807/integer-square-root-in-python – kennytm

答えて

0

、:

int(numpy.sqrt(M)+0.5) 

または

int(round(numpy.sqrt(M))) 
+0

より明示的には: 'int(round(np.sqrt(M)))' –

+0

@RobertKernありがとう。なぜround()が整数を返さないのか、私はいつも不思議です。 –

+1

CからのホールドオーバーC整数型では表現できない整数の 'double'値があります。 Python 3.somethingがそれを修正しました。 –