我在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不符。我猜这不应该发生吗?

最佳答案

您的问题似乎与C / C ++中浮点变量的有限精度有关。您可以here了解更多信息。有一些使这种影响最小化的技术(其中一些在Wiki文章中进行了描述),但是经过几次操作,总会损失一些准确性。您可能要使用一些支持任意精度数(例如GMP)的第三方数学库。但是,尽管如此,只要您坚持采用数值方法,您的计算精度就会受到影响。

关于c++ - dgesv中的舍入错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13235941/

10-10 07:41