python计算a b的和_python – Numpy:点(a,b)和(a * b).sum()之间的区别

Numpy dot是调用在编译时链接的BLAS库(或构建自己的)的例程之一.这样做的重要性是BLAS库可以利用乘法累加操作(通常是Fused-Multiply Add),这限制了计算执行的舍入数.

请执行以下操作:

>>> a=np.ones(1000,dtype=np.float128)+1E-14

>>> (a*a).sum()

1000.0000000000199948

>>> np.dot(a,a)

1000.0000000000199948

不准确,但足够接近.

>>> a=np.ones(1000,dtype=np.float64)+1E-14

>>> np.dot(a,a)

1000.0000000000176 #off by 2.3948e-12

>>> (a*a).sum()

1000.0000000000059 #off by 1.40948e-11

np.dot(a,a)将是更准确的两个,因为它使用了天真(a * a).sum())的大约一半的浮点舍入数.

Nvidia的一本书有4位精度的例子. rn代表最近4位数的4轮:

x = 1.0008

x2 = 1.00160064 # true value

rn(x2 − 1) = 1.6006 × 10−4 # fused multiply-add

rn(rn(x2) − 1) = 1.6000 × 10−4 # multiply, then add

当然,浮点数不会四舍五入到基数10的十六进制位,但是你得到了这个想法.

将上述符号中的np.dot(a,a)放入一些额外的伪代码中:

out=0

for x in a:

out=rn(x*x+out) #Fused multiply add

而(a * a).sum()是:

arr=np.zeros(a.shape[0])

for x in range(len(arr)):

arr[x]=rn(a[x]*a[x])

out=0

for x in arr:

out=rn(x+out)

从这个很容易看出,使用(a * a).sum()与np.dot(a,a)相比,数字被舍入了两倍.这些小差异总结可以改变答案.附加的例子可以找到here.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值