imgCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, ScanAdaptor.class);
((Activity) context).startActivity(intent);
}
}
和T1
是两个numpy数组,分别包含温度(开尔文,100到250之间)和压力(以帕斯卡为单位,介于700和1之间)。它们具有完全相同的形状P1
这些数组的每个元素都是432*45*135*135
。这是我的代码:
numpy.float32
以下是我的输出:
1 T2=T1+1.
2 P2=P1+1.
3 print np.sum(np.square(np.subtract(T2,T1)))
4 print np.sum(np.square(np.subtract(P2,P1)))
5 print ((T2-T1)-1.<1e-3).sum()
6 print ((P2-P1)-1.<1e-3).sum()
我无法理解为什么:
1.6792e+07
2.24963e+07
354294000
354294000
和T2-T1
都应该等于一个充满1s的P2-P1
数组。432*45*135*135
)432*45*135*135=354294000
和T2-T1
中的某些元素不等于1.如果我在指令5和6中提高比较的精度,则可以看到。表达式
P2-P1
提供输出:
print ((T2-T1)-1.<1e-5).sum()
print ((P2-P1)-1.<1e-5).sum()
我可以想象这些问题与精确度有关,但我不应该使用dtype 354293978
354041812
来解决这个问题。我试过了:
numpy.float32
哪个不会改变任何东西。任何的想法 ?感谢
答案 0 :(得分:1)
计算大量数字的总和是一个棘手的问题,因为计算机可能无法表示具有足够精度的数字。
32位浮点只有大约7位精度。因此,如果您向较大的数字添加较小的数字,并且它们之间的比率大于2^24
(≈1.7*10^7
),则结果可能正是那么大的数字。因此,在进行总和时,一旦您的总和达到该值,添加+1将不再更改总和。
你可以只是使用双精度(但是结果在这个数量的值上仍会有很大的误差)。否则你将不得不使用Kahan求和算法,或者,如果没有负数,则分阶段进行求和。例如,您可以先计算每行432个数字的总和,然后计算一列中45行的总和等。
答案 1 :(得分:0)
关注@roeland行,这段代码可以解决问题:
T1=T1.astype(np.float64)
T2=T1+np.float64(1.)
P1=P1.astype(np.float64)
P2=P1+np.float64(1.)
print np.sqrt(np.sum(np.square(np.subtract(T2,T1))))
print np.sqrt(np.sum(np.square(np.subtract(P2,P1))))
提供正确的输出:
354294000.0
354294000.0