Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy sum没有给出float32类型的正确答案_Python_Numpy - Fatal编程技术网

Python numpy sum没有给出float32类型的正确答案

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

我使用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,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年第一次出版时非常棒,经过在线编辑的再版至少也一样好