【问题标题】:Eigen floating-point precision特征浮点精度
【发布时间】:2016-02-22 04:09:26
【问题描述】:

我在使用 Eigen 时遇到浮点精度问题。

我有两个Eigen::MatrixXd;第一个矩阵 A (nx1) 仅包含正整数,而第二个矩阵 B (nx1) 包含一个填充了相同实数的列(例如:-0.714312)。

我需要计算以下Eigen::MatrixXd

const auto exponential = [](double x)
{ return std::exp(x); };


MatrixXd W = B.unaryExpr(exponential);
MatrixXd residuals = A - W;

问题是当我打印残差之和时:

cout << residuals.sum();
// output = 6.16951e-06

通过使用 R 和相同的输入矩阵执行相同的操作,我得到了不同的值。

通过使用 R 矩阵,我得到 -2.950208e-09。而ABW的元素之和在C++R中都是一样的。

【问题讨论】:

    标签: c++ r matrix precision eigen


    【解决方案1】:

    可能是 R 使用具有扩展精度(80 位)的 x87 FPU,而 Eigen 使用 SSE 单元(64 位/双精度)。您可以通过使用Matrix&lt;long double,Dynamic,Dynamic&gt; 矩阵类型或确保您的编译器将针对 x87 FPU 单元进行检查。

    【讨论】:

    • 不幸的是,使用 long double 会得到相同的结果。如何检查我的编译器是否针对 x87 FPU 单元?
    • 那么请更具体地说明 A 和 B 的实际值,以便我们重现。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2018-07-06
    • 2017-11-30
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多