2011-12-25 35 views
1

在Linux x86_64上的C++代碼中,我需要雙精度計算(+或 - )。如何控制雙精度計算以避免C++ linux x86_64中的舍入錯誤?

26.100000000000001 - 26 + 0.10000000000000001

我:

0.20000000000000143

我想0.2。

這裏,顯示格式不導入,計算結果將用於一些if-else分支條件。所以,我只希望if-else條件比較小數位後的4位數。

這似乎是一個舍入誤差?

如何限制小數點後的計算精度爲4位數?

我不想調用任何函數以避免開銷。

由於轉換開銷,我不想使用stringstream。

有什麼更好的點子?

感謝

回答

8

計算精度很好。這是你想要控制的顯示精度。如果使用<iostream>,則可以使用setprecision();如果使用<stdio.h>,則使用"%.4f"等格式化程序。

由於您是,所以您已經在呼叫功能!

P.S. 0.1不能完全由float,double或任何二進制尾數格式表示。它分解爲(1/2) * (1/5),十進制1/5是一個二進制無限重複的數字序列。

P.P.S.去看看GMP。這可能是你最好的希望。

+0

,顯示格式不是導入,計算結果將用於一些if-else分支條件。所以,我只希望if-else條件比較小數位後的4位數。 – user1002288 2011-12-25 18:53:37

+0

@ user1002288您想要做的事情對於二進制浮點不可行。沒有任何舍入黑客會像魔術一樣在二進制浮點工作上進行小數運算。 – Mysticial 2011-12-25 18:55:57

+4

@ user1002288您可以爲所有浮點精度比較添加一些魔法'epsilon'值。像'if(a == b){}'轉換成if(abs(a-b)<1e-4){}'。這是使用浮點算術可以做的最好的事情。 – aland 2011-12-25 19:00:26

2

如果你只是想打印出來,你可以用printf( 「%10.4lf」)。當然,您可以將精度改變爲任何你想要的。

+0

這裏,顯示格式不是導入,計算結果將用於某些if-else分支條件。所以,我只希望if-else條件比較小數位後的4位數。 – user1002288 2011-12-25 18:53:32

+0

哦,你的意思是顯示格式不重要!好吧..你可以嘗試乘以10 ^(精度)[精度= 4你的情況]。這裏的 – Neo 2011-12-25 19:09:42

1

如果您只對四位小數位的平等感興趣,請將所有數值乘以10,000並使用整數算術。 (您可能需要在乘以10,000後舍入。)