dgesv中的舍入误差?

时间:2012-11-05 16:10:13

标签: c++ fortran

我在C ++中使用dgesv和dgemm fortran子程序进行一些简单的矩阵乘法和左分割。

对于随机矩阵A和B,我这样做:

A\(A\(A*B));

其中*是使用dgemm和\使用dgesv定义的。显然,这个表达式应该简化为单位矩阵。我正在测试我对MATLAB的答案,我在对角线上得到或多或少1,但其他条目略有偏离(数字在e-15的数量级,所以它们已经接近0)

我只是想知道这个结果是否可以预期?因为如果我做这样的事情:

C = A+B;
D = A*B;

D\(C\(C*C));

结果应该出现在D \ C中。基本上,C(C * C)非常准确(完全匹配MATLAB),但第二个我做D \ C我得到的东西是e-1甚至e + 00。我猜这不应该发生?

1 个答案:

答案 0 :(得分:2)

您的问题似乎与C / C ++中浮点变量的有限精度有关。您可以阅读更多相关信息here。有一些技术可以最大限度地减少这种影响(其中一些在wiki文章中有描述)但是在一些操作之后总是会有一些精度损失。您可能希望使用一些支持任意精度数的第三方数学库(例如GMP)。但是仍然 - 只要你坚持数值方法,你的计算精度就会一直受到污染。