python - numpy.dot 对大型数组有精度限制吗?
问题描述
numpy.dot 对于大型数组是否会出错?我正在使用配备 4 GHz Intel Core i7 和 32 GB 1600 MHz DDR3 的 iMac。我进行了一个简单的实验,使用 for 循环与矢量化比较从 1 到大数的平方和。当总和足够大时,向量化方法是错误的。请看下面的实验:
i = 3024617
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))
i = 3024618
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))
第一个差异——任何 i < 3024617 的差异为 0
第二个差异——任何 i >= 3024618 的差异是一个大整数
我希望所有整数 i 的差异都为 0。
解决方案
Python 整数是无界的。 int64
仅限于带符号的 64 位整数可以表示的内容:
>>> i = 3024617
>>> x = sum([j**2 for j in range(1,i)])
>>> x
9223371388520336796
>>> hex(x)
'0x7fffff690c418d9c'
>>> x.bit_length()
63
所以这个总和正好适合一个有符号的 64 位整数。也加入i**2
,它不再这样做:
>>> x += i**2
>>> hex(x)
'0x800007bb0de78dad'
>>> x.bit_length()
64
不可能用有符号的 64 位整数忠实地表示该总和。
推荐阅读
- c# - 在 C# 应用程序中使用少量代理服务器来探索 html 页面
- powershell - 安装 .Net Framework 4.7.1 后是否需要重新启动 windows 服务器
- c# - using(Bitmap) 偶尔并行抛出异常
- excel - 在 Excel 中,为什么布尔值返回的结果与布尔公式不同?
- apache-spark - 使用 spark 重试 Oracle 连接
- c# - 将 SqlCommand 中的参数指示符从 '@' 更改为 ':'
- continuous-integration - Travis CI - 带点 (.) 的环境变量键
- c - 即使使用 LIBRARY_PATH、LD_LIBRARY_PATH 和 LD_PRELOAD,ld 也无法在空环境中找到 -lz
- amazon-web-services - 无法上传 HelloWorldFunction 资源的 CodeUri 参数引用的工件无
- node.js - 我无法运行 npm start