Python numpy sum没有给出float32类型的正确答案
我使用numpy对数组求和,但它不适用于float32类型。我做错了什么?一旦我直接求和,然后使用numpy.sum。请参见下面的代码Python numpy sum没有给出float32类型的正确答案,python,numpy,Python,Numpy,我使用numpy对数组求和,但它不适用于float32类型。我做错了什么?一旦我直接求和,然后使用numpy.sum。请参见下面的代码 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,y
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.sum给出的是错误的结果。但是,如果我使用float64,那么np.sum将给出正确的结果。这背后的原因是什么
谢谢。有这么大的数字,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)重新获得精度。可能导致舍入错误\在将大量小数字相加时精度损失 如果你先求一个轴的和,然后求其和。你得到了正确的答案
print(np.sum(bx1**2+bx2**2+bx3**2, axis=0).sum())
浮点是一种狡猾的生物,永远不要相信他们。其他回答都是对这个问题的极好的具体回答。在这篇文章中可以找到关于这类问题的一般答案。原著在1991年第一次出版时非常棒,经过在线编辑的再版至少也一样好