【发布时间】:2020-11-16 09:25:09
【问题描述】:
来自以下 Python 代码:
val = 499997
val**3
我得到了一个合理的结果:124997750013499973。
但是,从下面使用 numpy 的代码:
import numpy as np
val = 499997
np_val = np.arange(start=val, stop=val+1, dtype=np.uint64)
np_val**3
我得到了一个奇怪的结果,例如:array([124997750013499968], dtype=uint64)
是不是numpy的bug???
【问题讨论】:
-
不,这不是错误,只是 64 位无符号整数的限制。 Python 的原生整数具有任意精度,它们不限于特定的位数。
-
@jonrsharpe 公平点。 OTOH,
499997**3的位长为 57,np_val * np_val * np_val返回正确的值 124997750013499973。我的第一个猜测是 Numpy 可能正在使用日志进行求幂,但np.uint64(np.exp(np.log(np_val) * 3))返回 124997750013500208。但是如果我转换为np.float96,例如np.uint64(np.exp(np.log(np.float96(np_val)) * 3))我得到了正确的结果。转换为np.float64与没有转换的结果相同。 -
@PM2Ring 嗯,有趣
-
>>> '%.3f' % 499997.0 ** 3 '124997750013499968.000' -
@AnttiHaapala 回家吧,Numpy。你醉了! :) 这与
np.uint64(np.float64(np_val) ** 3)的答案相同。我想这比np.uint64(np.float32(np_val) ** 3)返回 124997747475480576 更好