web-dev-qa-db-ja.com

math.powが正しい答えを返すのに、numpy.powerが小さな指数に対して0を返すのはなぜですか?

In [25]: np.power(10,-100)
Out[25]: 0

In [26]: math.pow(10,-100)
Out[26]: 1e-100

私は両方のコマンドが1e-100を返すことを期待します。精度を500に上げても問題が解決しないため、これも精度の問題ではありません。正しい答えを得るために変更できる設定はありますか?

53
Jishnu

ああ、それはそれよりもはるかに「悪い」です:

In [2]: numpy.power(10,-1)   
Out[2]: 0

しかし、これは何が起こっているかについてのヒントです。10は整数であり、numpy.powerは数値を浮動小数点数に強制しません。しかし、これは機能します:

In [3]: numpy.power(10.,-1)
Out[3]: 0.10000000000000001

In [4]: numpy.power(10.,-100)
Out[4]: 1e-100

ただし、電力演算子**doesはfloatに変換されることに注意してください。

In [5]: 10**-1
Out[5]: 0.1
71
Andrew Jaffe

numpyメソッドは、整数を指定したため、整数が返されることを前提としています。

np.power(10.0,-100) 

期待どおりに機能します。

35
John Greenall

(このページの他の2つの回答の脚注です。)

入力に2つの入力値が与えられた場合、types属性を調べることにより、np.powerが返すオブジェクトのデータ型を確認できます。

>>> np.power.types
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q', 
 'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O']

Python互換の整数型はlで示され、互換性のあるPythonはddocuments )で浮動します。

np.powerは、渡された引数のタイプをチェックし、このリストから最初に一致する署名を使用することにより、何を返すかを効果的に決定します。

したがって、10と-100が与えられると、np.powerinteger integer -> integer署名と一致し、整数0を返します。

一方、引数の1つがfloatの場合、 整数引数もfloatにキャストされますfloat float -> floatシグネチャが使用されます(正しいfloat値が返されます) )。

2
Alex Riley