【发布时间】:2019-08-10 06:06:17
【问题描述】:
我有这个示例代码:
#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
这三个值不应该都一样吗?毕竟我没有使用任何优化。
【问题讨论】:
-
由于舍入误差,浮点数学依赖于运算顺序。
-
那显着?我预计会有一些最后一位数的差异,但这是一个 ~ 0.01% 的总误差或大约。取决于相当重要的应用程序。
-
@DoktorSchrott 你的
MatrixXf M是一个由 10^6 个单精度浮点数组成的矩阵。尝试双打。另外,有些相关:stackoverflow.com/questions/6699066/… -
@doktorschrott,是的,如果你这样做 100 万次