2016-02-01 158 views
0

我比較C中的簡單浮點數和雙精度浮點數,特別是它們的值都是8.7。現在我將8.7分配給每個變量,當我打印時,兩個值的結果都是8.7000。爲什麼編譯器添加了這些零。我想問的主要問題是還有沒有更多的數字,我沒有看到,如在尾隨零後隱藏。我讀過我不應該用浮點數來比較浮點數,因爲精度不夠高,但是我認爲這樣一個小數值肯定可以存儲8.7個具有一定準確度的數據,以便將其與另一個8.7數值進行比較?C浮點數和雙重比較

我唯一擔心的是它實際上是在記憶中的某個地方表現爲例如8.70000003758什麼的,這是拋出我的比較?我試圖%.20f給printf看到任何進一步的數字可能被隱藏,但我認爲這是沒有,否則那裏數的整個準確性剛剛創建的數字更改爲8.6918734634834929或類似的東西。

+1

[如何在C中的內存中表示FLOAT編號]可能的重複(http://stackoverflow.com/questions/6910115/how-to-represent-float-number-in-memory-in-c) –

+0

1/3是一個很小的值。但是沒有固定精度的十進制表示可以精確地存儲它。你的推理是完全無效的。 –

+0

如果你真的想看到不同之處,可以嘗試在gdb中運行應用程序並查看兩個變量。您將能夠看到內部表示。你將不得不查看浮點數如何表示在上面的評論。 – bruceg

回答

3

我比較C中的簡單浮點數和雙精度值,特別是它們的值都是8.7。

不好的選擇,因爲8.7沒有確切的二進制表示。

現在我分配8.7給每個變量,當我打印時,我得到了兩個值的結果8.7000。爲什麼編譯器添加了這些零。

它還沒有,你的打印程序有。

而我想問的主要問題是有沒有進一步的數字,我沒有看到,如在後面的零後隱藏。

當然,因爲8.7沒有確切的二進制表示。 (試着寫出來爲2的整數次冪的總和,你不能這樣做。)

我讀了我不應該做的比較像這樣用浮子由於缺乏精確度,但我認爲這樣一個很小的值肯定可以存儲8.7個具有一定準確度的需要與另一個8.7值進行比較的準確度?

你以爲是錯的。 1/3很小,但沒有精確的十進制表示和有限的數字位數。一個值是大還是小與它是否可以完全用特定基數的有限數字表示無關。

我唯一的擔心是它實際上代表某處在記憶中,例如8.70000003758或其他東西,這是拋出我的比較?

準確地說,就像代表1/3作爲0.333333333會做的那樣。

我試圖%.20f給printf看到任何進一步的數字可能被隱藏,但我認爲這是沒有,否則那裏數的整個準確性剛剛創建的數字更改爲8.6918734634834929或類似的東西。

這可能只是一個錯誤。向我們顯示該代碼。也許你試圖輸出一個雙精度數,並且忽略了l

+0

好的謝謝你的明確答案。是否有一種方法可以在一定的小數點後截斷任何數字,以對我的目的進行精確的比較。我只想要一個可以比較的十進制數字float!= double。但我需要一個大致準確的數字,即使是1個點是好的 –

+0

@JohnSetter請不要比較浮點數的平等,即使他們是相同的類型 - 沒關係不同類型。請參見[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+4

您可以輕鬆地比較浮點數以獲得近似相等。 simpleminded的方式是使用'if(fabs(a - b)<0.001)'這樣的代碼。查看C FAQ列表以獲得更好的答案:http://c-faq.com/fp/fpequal.html –