c ++和matlab浮点计算

时间:2012-07-12 21:06:36

标签: c++ matlab floating-point

有人能告诉我c ++和matlab是否使用相同的浮点计算实现?我会在Matlab中获得与在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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

虽然目前还不清楚你的数字究竟是什么,但是第一个(和最大)数字的相对差异大约是1e-8,这是许多双精度算法的相对容差。

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

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

Boost :: Test中关于floating point comparison tests的部分讨论了这一点,并且有一些很好的参考。特别是,您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic并考虑购买一份Knuth的TAOCP Vol. II

答案 1 :(得分:0)

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

浮点的表示在两者之间是相同的,并且是处理器或我相信标准。但正如所提到的,浮点数极其易变,你总是要允许一些容忍度。如果您执行复杂操作(例如下面的操作),您将经常获得非零数字,尽管代数告诉您。关于如何使用matlab和c完成操作之间的内容将允许一些差异。只要确保它们接近。

((3*pi+2)*5-9)/2-7.5*pi-3