鍍金池/ 問答/Python  Ruby  網(wǎng)絡(luò)安全/ numpy.sum計算錯誤,數(shù)值溢出?

numpy.sum計算錯誤,數(shù)值溢出?

就很簡單的一個求和計算:

import numpy as np
np.sum(range(10000000))

Out[117]: -2014260032

和直接用內(nèi)置的函數(shù)計算結(jié)果不一樣

sum(range(10000000))

Out[118]: 49999995000000

后來我用二分法驗證了一下臨界值是多少

np.sum(range(i)) == sum(range(i))

驗證了幾次差不多猜出來了,是2**16=65536

np.sum(range(65536)) == sum(range(65536))

Out : True

超過這個數(shù)就不行,這不是有很大的安全隱患啊,這還怎么用numpy的內(nèi)置函數(shù),而且速度感覺也不怎么樣,沒sum快,可能是溢出影響效率的問題吧(猜測)

但是我覺得np和python一樣是支持無限大整數(shù)的,驗證確實這樣:

np.array(range(2**20))

可以正常運行

我感覺是不是歷史遺留問題啊,求個sum都可以溢出

是不是直接用sum替換之就可以了,大家對這有什么看法?
有沒有人遇到過類似的問題?
謝謝

我覺得我可以去report bug一波了23333

回答
編輯回答
柚稚

np.sum(np.array(range(10000000), dtype=float))
numpy底層用c優(yōu)化的,應(yīng)對任何數(shù)學(xué)問題,默認(rèn)的dtype是int32,當(dāng)然溢出來啦

2018年5月15日 02:05