matlab 随机数重新排序的和合并组合为循环值

wbrvyc0a  于 7个月前  发布在  Matlab
关注(0)|答案(1)|浏览(92)
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

kt06eoxx

kt06eoxx1#

您的价值观列表:

8.881784197001252e-15
3.552713678800501e-15
2.6645352591003757e-15
4.440892098500626e-16
1.7763568394002505e-15

匹配

>> [40,16,12,2,8].' * eps

ans =

   1.0e-14 *

   0.888178419700125
   0.355271367880050
   0.266453525910038
   0.044408920985006
   0.177635683940025

这是完全预期,你会得到舍入误差在这个范围内。在两个不同的系统中获得完全相同的两个值并不是那么大的巧合。这是偶然发生的。
eps是机器的整数,是你可以加到1上得到下一个数字的最小值。添加100个(单位正常)随机值的结果大多碰巧在1-32的范围内,更小的值更有可能。我们还期望舍入误差较小。结果的精度。因此,我们应该能够将这些数字写为<small integer> * eps(<binary magnitude of result>)

8.881784197001252e-15  == 5 * eps(8)
3.552713678800501e-15  == 1 * eps(16)
2.6645352591003757e-15 == 3 * eps(4)
4.440892098500626e-16  == 1 * eps(2)
1.7763568394002505e-15 == 1 * eps(8)

注意MATLAB recently changed its implementation of sum , explicitly to reduce rounding errors。还有那个NumPy uses a similar strategy to sum values in an array

相关问题