我有以下数组:
values = np.array(
[[0.00000000000000000000000e+00,
0.00000000000000000000000e+00],
[-4.79999759999999625000000e+14,
-0.00000000000000000000000e+00],
[4.79999759999999625000000e+14,
-0.00000000000000000000000e+00],
[-0.00000000000000000000000e+00,
-4.79999759999999625000000e+14],
[-3.74998499999999072265625e+12,
-3.74998499999999072265625e+12],
[3.74998499999999072265625e+12,
-3.74998499999999072265625e+12],
[-0.00000000000000000000000e+00,
4.79999759999999625000000e+14],
[-3.74998499999999072265625e+12,
3.74998499999999072265625e+12],
[3.74998499999999072265625e+12,
3.74998499999999072265625e+12]]
)
它包含0,4.7999975999999625e +14,3.7499849999999072265625e +12和它们的负对应。
print(np.sum(values, axis=0))
结果应该是[0.0.](或者至少是非常非常小的值),但是它没有,它的结果是[ 0. -0.01855469]
。
我想,这是一个浮点精度错误,原因是numpy无法进行成对求和,所以我也试了一下:
values_T = np.array(
[[0.000000000000000000000000e+00,
-4.799997599999996250000000e+14,
4.799997599999996250000000e+14,
-0.000000000000000000000000e+00,
-3.749984999999990722656250e+12,
3.749984999999990722656250e+12,
-0.000000000000000000000000e+00,
-3.749984999999990722656250e+12,
3.749984999999990722656250e+12],
[0.000000000000000000000000e+00,
-0.000000000000000000000000e+00,
-0.000000000000000000000000e+00,
-4.799997599999996250000000e+14,
-3.749984999999990722656250e+12,
-3.749984999999990722656250e+12,
4.799997599999996250000000e+14,
3.749984999999990722656250e+12,
3.749984999999990722656250e+12]]
)
print(np.sum(values_T, axis=1))
结果是[ 0. -0.00927734]
。不知何故,误差减半了,但仍然不正确。
两个数组都是C连续的(通过np.ndarray.flags
检查)。
任何帮助都是感激的!
1条答案
按热度按时间fcy6dtqo1#
也许在求和之前按绝对值对值进行排序?
输出:
一个更大的测试,使用10-20个随机数及其否定的数组, Shuffle :
示例输出显示排序的总和总是0.0,而未排序的总和很少是: