gpt4 book ai didi

c++ - Eigen sum()、colwise().sum().sum() 和 rowwise().sum().sum() 都给出了不同的答案

转载 作者:太空狗 更新时间:2023-10-29 20:08:17 34 4
gpt4 key购买 nike

我有这个示例代码:

#include <Eigen/Eigen>
#include <iostream>

int main() {
Eigen::MatrixXf M = Eigen::MatrixXf::Random(1000, 1000);
std::cout.precision(17);
std::cout << M.colwise().sum().sum() << std::endl;
std::cout << M.rowwise().sum().sum() << std::endl;
std::cout << M.sum() << std::endl;
}

我使用以下命令进行编译:(g++ 版本 7.3,但我在其他编译器中也看到过)

g++ -O0 -o test -Ieigen-3.3.7 test.cc

输出是

13.219823837280273
13.220325469970703
13.217720031738281

这 3 个值不应该都相同吗?毕竟我没有使用任何优化。

最佳答案

你的加法基本上是随机游走,你犯的错误是不同的随机游走(因为你几乎每一步都有舍入误差)。 (注意 Eigen::MatrixXf::Random[-1, 1] 中的随机值填充矩阵。)

假设您的浮点值平均为 10.0 (仅根据您提供的单个数据点进行估算)。因此,您的 epsilon(任何加法可能会产生多少绝对舍入误差)约为 10.0 * 6e-8 ( float 是 2-23 或大约 6e-8 )或大约 6e-7 .

如果你这样做 N = 1000000步长的随机误差累积步+6e-7 (或 -6e-7 ),你很有可能在 sqrt(N) * stepSize = 1000 * 6e-7 = 6e-4 左右结束(参见 here ),这与您的 0.01% 并不太巧合。

我同样会估计绝对误差为 1000 * 10 * 1e-16 = 1e-12由于浮点精度,在 -1 和 1 之间添加了 100 万个随机 double 值。

这显然不是严格的数学处理。它只是表明错误肯定在正确的范围内。

减少此问题的常用方法是在添加 float 之前按升序对 float 进行排序,但这样做时您仍然可以任意不精确。 (示例:继续将数字 1.0f 添加到自身 - 总和将在 2^24 处停止增加,其中 epsilon 变得大于 1.0f。)

关于c++ - Eigen sum()、colwise().sum().sum() 和 rowwise().sum().sum() 都给出了不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55245641/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com