0

有人可以告诉我 c++ 和 matlab 是否使用相同的浮点计算实现吗?我会在 C++ 中获得与在 Matlab 中相同的值吗?

目前,我将 Matlab 代码翻译成 C++ 时存在这些差异:

Matlab: R = 1.0000000001623, I = -3.07178893432791e-010, C = -3.79693498864242e-011

C++:    R = 1.00000000340128 I = -3.96890964537988e-009  Z = 2.66864907949582e-009

如果不是,有什么区别,我在哪里可以找到更多关于浮点计算实现的信息?

谢谢!

4

2 回答 2

1

虽然不清楚你的数字实际上是什么,但第一个(也是最大的)数字的相对差异约为 1e-8,这是许多双精度算法的相对容差。

浮点数只是实数系统的近似值,它们的有限大小(双精度为 64 位)限制了它们的精度。由于这种有限的精度,涉及浮点数的运算可能会产生舍入误差,因此不是严格关联的。这意味着 A+(B+C) != (A+B)+C。两者之间的差异通常很小,具体取决于它们的相对大小,但并不总是为零。

这意味着当您将 Matlab 中编码的算法与 C++ 中的算法进行比较时,您应该期望相对值和绝对值存在微小差异。不同之处可能在于库(即,不能保证 Matlab 将系统数学库用于例程,例如sqrt),或者可能只是您的 C++ 和 Matlab 实现对它们的操作排序不同。

Boost::Test 中关于浮点比较测试的部分对此进行了一些讨论,并提供了一些很好的参考资料。特别是,您可能应该阅读每个计算机科学家应该知道的关于浮点运算的知识,并考虑拿起一份 Knuth 的TAOCP Vol. 二

于 2012-07-13T01:28:37.453 回答
0

Matlab 默认使用双浮点精度,C 浮点使用单浮点精度。

浮点的表示在两者之间是相同的,要么是处理器,要么是我相信的标准。但如前所述,浮点数非常多变,您总是必须允许一些容忍度。如果您执行复杂的操作,例如下面的操作,您将经常得到一个非零数,尽管代数告诉您并非如此。使用 matlab 和 c 如何完成操作之间的幕后东西将允许一些差异。只要确保它们靠近即可。

((3*pi+2)*5-9)/2-7.5*pi-3
于 2012-07-13T02:48:35.970 回答