numpy sum没有给出float32 typ的正确答案

2024-10-03 23:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用numpy对数组求和,但它不适用于float32类型。我做错什么了?一旦我直接求和,然后我用数字总和. 请参阅下面的代码

import struct
import numpy as np
import matplotlib.pyplot as plt
import math
from pylab import *
xpt=128
ypt=128
zpt=256
bx1=np.zeros((xpt,ypt,zpt),dtype=float32)
bx2=np.zeros((xpt,ypt,zpt),dtype=float32)
bx3=np.zeros((xpt,ypt,zpt),dtype=float32)

bx1=bx1+1.0
bx2=bx2+1.5
bx3=bx3+2.0

dummy=0.0
for kxi in range (0,xpt) :
  for kyi in range (0,ypt) :
    for kzi in range (0,zpt) :
      dummy=dummy+(bx1[kxi,kyi,kzi]*bx1[kxi,kyi,kzi]+bx2[kxi,kyi,kzi]*bx2[kxi,kyi,kzi]+bx3[kxi,kyi,kzi]*bx3[kxi,kyi,kzi])
print(dummy)

print(np.sum(bx1**2+bx2**2+bx3**2))

两个输出应该匹配。输出结果:
30408704.0
3.1323e+07

直接和给出了正确的结果,而np.总和是给错了什么。但是,如果我使用float64,那么np.总和给出正确的结果。这背后的原因是什么?在

谢谢。在


Tags: importnpzeroszptdummy总和float32xpt
3条回答

对于一个这么大的数字,float32的精度是个问题。我还没有详细介绍如何存储2.25,但是有一个最小的例子

x = 2.25 * np.ones((128, 128, 256), dtype = float32)
y = 2.25 * np.ones((128, 128, 256), dtype = float64)
x.sum() # 8854642.0
y.sum() # 9437184.0
2.25 * 128 * 128 * 256 # 9437184.0

显示您失去了准确性,但使用float64(python的standard float)重新获得它。在

其他的回答是对这个问题的极好的具体回答。这类问题的一般答案可以在文章What Every Computer Scientist Should Know About Floating-Point Arithmetic中找到。原著在1991年首次出版时非常棒,经过编辑的网上转载至少也一样好。在

舍入误差的可能原因\当大量小数相加时,精度损失。在

如果你先对一个轴求和,然后再求它的结果。你得到了正确的答案。在

print(np.sum(bx1**2+bx2**2+bx3**2, axis=0).sum())

浮点是一种狡猾的生物,永远不要相信它们。在

相关问题 更多 >