我正在使用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.总和给出正确的结果。这背后的原因是什么?在
谢谢。在
对于一个这么大的数字,float32的精度是个问题。我还没有详细介绍如何存储2.25,但是有一个最小的例子
显示您失去了准确性,但使用float64(python的standard float)重新获得它。在
其他的回答是对这个问题的极好的具体回答。这类问题的一般答案可以在文章What Every Computer Scientist Should Know About Floating-Point Arithmetic中找到。原著在1991年首次出版时非常棒,经过编辑的网上转载至少也一样好。在
舍入误差的可能原因\当大量小数相加时,精度损失。在
如果你先对一个轴求和,然后再求它的结果。你得到了正确的答案。在
浮点是一种狡猾的生物,永远不要相信它们。在
相关问题 更多 >
编程相关推荐