2012-07-12 141 views
0

有人能告訴我,如果c + +和matlab使用相同的浮點計算實現?我將在Matlab中獲得與C++相同的值嗎?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 

如果不是有什麼區別,我在哪裏可以找到更多關於浮點運算的實現?

謝謝!

+0

我相信浮點是本機的處理器,而不是語言,但我不知道足夠寫在回答框中。 – 2012-07-12 21:08:14

+10

永遠不要期望與浮點計算一致 - 即使只是改變順序也可以提供不同的結果,即使使用相同的CPU指令也是如此。 – 2012-07-12 21:09:08

+4

您可能需要顯示一些代碼,而不僅僅是結果,才能找出有用的答案。 – 2012-07-12 21:12:44

回答

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的副本。

0

Matlab默認使用雙浮點精度,C浮點使用單浮點精度。

這兩個浮點的表示法是相同的,並且是處理器或者我相信一個標準。但如前所述,浮點非常浮躁,你總是需要考慮到一些寬容。如果你做了一個複雜的操作,比如下面的操作,你會經常得到一個非零的數字,儘管代數告訴你,否則。 matlab與c之間的操作是如何實現的,將會帶來一些差異。只要確保它們靠得很近。

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