g0 = randn(1, 100);
g1 = g0;
g1(2:end) = flip(g1(2:end));
sprintf("%.15e", sum(g0) - sum(g1))
g0 = np.random.randn(100)
g1 = g0.copy()
g1[1:] = g1[1:][::-1]
print(sum(g0) - sum(g1))
在Python和MATLAB中,重新运行这些命令足够多次将重复以下值(或其负数;不完整列表):
8.881784197001252e-15
3.552713678800501e-15
2.6645352591003757e-15
4.440892098500626e-16
1.7763568394002505e-15
事实上,我第一次和第二次运行它们-mat -> py -> mat -> py
-它们 * 完全相同 *,让我认为它们在系统级别上共享RNG,但有延迟。(但忽略这个问题发生的情况)。
我宁愿掉到地上也不愿这么巧,而且还跨越了不同的语言。
发生什么事了?
Windows 11
,Python 3.11.4
,numpy 1.24.4
,MATLAB 9.14.0.2286388 (R2023a) Update 3
,
1条答案
按热度按时间kt06eoxx1#
您的价值观列表:
匹配
这是完全预期,你会得到舍入误差在这个范围内。在两个不同的系统中获得完全相同的两个值并不是那么大的巧合。这是偶然发生的。
eps
是机器的整数,是你可以加到1上得到下一个数字的最小值。添加100个(单位正常)随机值的结果大多碰巧在1-32的范围内,更小的值更有可能。我们还期望舍入误差较小。结果的精度。因此,我们应该能够将这些数字写为<small integer> * eps(<binary magnitude of result>)
:注意MATLAB recently changed its implementation of
sum
, explicitly to reduce rounding errors。还有那个NumPy uses a similar strategy to sum values in an array