2012-03-25 37 views
0

我正在讀取工作中流量計算機上的寄存器(有點像PLC)。根據文檔,寄存器存儲爲IEEE單精度浮點數。我讀取寄存器並將其存儲在CComVariants(MS VARIANT類的包裝)中。存儲具有單精度浮點變量的分數

我知道這樣的值被存儲在設備寄存器...

0.45 
0.3 
0.2 
0.05 

當我經由VS2010一個斷點暫停執行我看到的值,像這樣奇怪後餾分...

0.4500000000031 
0.300000034 
0.2000000005 
0.05000000004 

我的問題是,這是一個問題,Visual Studio 2010 IDE是不精確的,或者是IEEE單精度浮點數對此應用程序不夠精確(+/- 0.00001)?

我問,因爲我可能要放在代碼來檢查,看看是否這些值是在一定範圍內以後和代碼進行檢查,看是否所有的分數總和爲1

回答

1

浮點精度小數點後的位數。 單人/雙人等是它能夠存儲的號碼的範圍以及在該點之後能夠保留多少個地方。

如果你想要精確的表示,那麼你不能使用浮點數。

您可以嘗試將它們轉換爲十進制類型或其他類型(* 100,例如使用int),或者將其作爲足夠精確的值並將其保留。

浮點數不能表示所有可能的值。會有差距。 IT與小數點後三分之一寫相同的問題。

0.33333333已接近,但它是漸近的。通過加入更多3秒,你可以接近1/3,但你永遠不會到達那裏。

0

浮點數一般不存儲分數。通常,單精度浮點數「float」存儲一個符號,一個24位二進制數(「有效數」)和一個用於縮放數字的8位指數。如果符號爲s(+1或-1),有效數爲f,指數爲e,則存儲的浮點數表示s * f * 2 e

浮點數不能正好表示.45,因爲沒有符號,有效位數和指數,所以s * f * 2 e正好是.45。沒有精度可以改變這一點,因爲沒有整數乘以2乘以整數的冪,恰好等於0.45。因此,當.45準備存放在浮動物中時,它必須是圓形的,通常是浮動物可表示的最接近的數字。這就是爲什麼你看到0.4500000000031。

請注意,有一些我遺漏了。這些可能不會幫助解決您的直接問題,但我會提及它們的完整性:可能會出現非典型的浮點表示。這些日子他們很少見;在IEEE-754浮點運算標準之前它們更常見。儘管有效位是24位,但只存儲了23位;領先位隱含一個。 8位指數存儲爲1到254之間的數字,表示-126到127的指數。當存儲的指數爲0時,有效位數少於24位;隱含位爲零,指數保持在-126。當存儲的指數爲255時,浮點表示無窮大(如果有效數爲零)或「不是數字」(否則)。最新的IEEE-754標準規定了十進制算術的格式,但並非所有的系統都支持它。

如果您使用的系統支持十進制算術,並且您所使用的所有數字都可精確表示爲可用精度中的小數點,則可以使用它來獲得確切答案。

如果你沒有十進制算術,一個選擇是使用更常見的二進制浮點算術,但處理舍入誤差。有時候,當你有一個數字列表完全加1,並且將它們存儲在浮動數據中並且浮點數相加時,你會得到一個不完全爲1的答案。有時候,當你的數字不加1時,並且以相同的方式添加它們,您將得到正好1.因此,可能會出現假陽性結果(「是,總和爲1」,但不是)和假陰性結果(「不,總和不1「,但它是)。您可以選擇拒絕接受誤報的虛假否定。 (例如,計算你的求和過程中會出現多少錯誤,並接受任何接近1的數字。這將導致你接受所有的總和,如果完成的話它將爲1,但它也會導致你接受一些總和如果完全相同,則不爲1.)

如果這不可接受,可能有其他方法來執行您的計算。如果你的所有數字的形式都是n/100,其中n是一個整數,那麼將n存儲在一個int中,而不是將n/100存儲在一個float中。然後,您可以準確地添加整數,如果存儲的整數之和爲100,則您知道確切的總和爲1.