2008-09-11 84 views
32

在跟進到this question後,似乎有些數字根本不能用浮點數表示,而是近似表示。浮點是如何存儲的?它什麼時候重要?

浮點數如何存儲?

是否有不同尺寸的通用標準?

如果我使用浮點,需要注意哪些問題?

它們是跨語言兼容的嗎(例如,我需要處理哪些轉換以將一個浮點數從Python程序發送到基於TCP/IP的C程序)?

- 亞當

回答

22

如上所述,Wikipedia article on IEEE 754在顯示大多數系統上如何存儲浮點數方面做得很好。

現在,這裏有一些常見的問題:

  • 最大的是,你幾乎從來沒有要比較相等(或等於)兩個浮點數。您需要使用大於/小於比較。
  • 您對浮點數進行的操作越多,舍入誤差就會變得越重要。
  • 精度受分數大小的限制,因此您可能無法正確添加相隔幾個數量級的數字。 (例如,您將無法添加到1E30 1E30)
0

記得什麼是一個32位浮點,使用24位對一個實際數目存儲,並且保持8位用作10的冪,確定在何處小數點。

我關於這個問題壽有點生疏...

5

的標準是IEEE 754

當然,當IEE754還不夠好的時候,還有其他方法可以存儲數字。 Java的BigDecimal等庫可用於大多數平臺,並可以很好地映射到SQL的數字類型。符號可以用於非理性數字,而不能用二進制或十進制浮點精確表示的比例可以按比例存儲。

2

這個標題爲「IEEE Standard 754 Floating Point Numbers」的article可能會有幫助。說實話,我並不完全確定自己正在理解你的問題,所以我不確定這會有幫助,但我希望它會有幫助。

3

基本上你需要擔心的浮點數是有限的精度數位數。當測試相等性時,這可能會導致問題,或者如果您的程序實際上需要比數據類型所提供的精度更多的數字。

在C++中,一個很好的經驗法則是認爲浮點數爲7位數的精度,而double爲15。 this問題線程。

5

對於問題的第二部分,除非性能和效率對您的項目很重要,否則我建議您將浮點數據作爲字符串通過TCP/IP傳輸。這可以避免諸如字節對齊之類的問題,並且會緩解調試。

1

如果您真的擔心浮點舍入錯誤,大多數語言都會提供沒有浮點錯誤的數據類型。 SQL Server具有Decimal和Money數據類型。 .Net具有十進制數據類型。它們不像Java中的BigDecimal那樣具有無限的精度,但它們精確到它們定義的小數點數。所以你不必擔心你輸入的美元價值爲4美元。58保存爲浮點數值4.579999999999997

3

在跟進這個問題, 似乎有些數字不能被浮點在所有代表 ,而是近似的。

正確。

浮點數如何存儲? 是否有不同大小的共同標準?

正如其他海報已經提到的,幾乎只有IEEE754及其後繼者 IEEE754R。谷歌搜索它給你一千個解釋與位模式和他們的解釋。 如果仍然有問題需要解決,還有兩種常見的FP格式:IBM和DEC-VAX。對於一些深奧的機器和編譯器(BlitzBasic,TurboPascal),有一些奇怪的格式。

如果我使用浮點,需要注意哪些問題? 他們跨語言兼容(即,我需要處理什麼轉換以 發送一個浮點數從Python程序到C程序通過TCP/IP)?

實際上沒有,它們是跨語言兼容的。

非常罕見發生的歷史怪癖:

  • IEEE754限定sNaNs(信號NaN)和qNaNs(提示NaN)。前者會導致陷阱,迫使處理器在加載時調用處理程序例程。後者不這樣做。因爲語言設計者討厭sNaNs中斷他們的工作流程並支持他們強化對處理程序例程的支持的可能性,sNaN幾乎總是被悄無聲息地轉換成qNaNs。 所以不要依賴1:1原始轉換。但是,這又是非常罕見的,只有在存在NaNs 時纔會發生。

  • 如果共享不同計算機之間的文件,則可能存在排序問題(字節順序錯誤)。它很容易被檢測到,因爲你得到的是數字的NaN。

相關問題