2011-02-16 78 views
3

鑄造(浮動)33554329L的結果是33554328.如果數字然後退回到長的值停留在33554328,有任何一個解釋。浮法鑄造值減1 1

在C使用VS2005 ++ [非管理]

回答

2

Floats具有非常低的精度高(3十億+)號。

浮球的精度在0-1範圍內是最好的。你從零開始越遠,精度就越低。在30億左右,它不足以保存每一個整數(所以它可以代表最接近的值)。

解決方案:使用double(或decimal representation)。

+0

的OP的數量只有約33億美元。 – Mephane 2011-02-16 09:40:43

1

各種浮點類型表示的準確性因其大小而異。對於32位浮點數,您可以期望大約7位數的精度。對於雙數是大約16位數字。

我強烈建議閱讀浮點表示和各種優缺點。從長遠來看,它會爲您節省很多麻煩,特別是當比較之類的事情不像您期望的那樣有效時。

7

32位浮點數爲23位,尾數爲8,388,608個不同的值。這意味着精確度大約是7位十進制數字。您的電話號碼有8位十進制有效數字,因此您會看到最後一位有效數字中的精度損失。
Here's More information on float representation

雙精度是64位,並具有5​​2比特用於其是4,503,599,627,370,496(16位號碼)的尾數,並因此具有大致15-16十進制數字的準確性。

A decimal類型是可能允許您以任何準確度保存任何數量的任意長度的東西。 C#擁有它們,但不幸的是,它們不是C++中的原始類型。你也許可以找到一些第三方庫,用C++實現它們。

+0

實際上,由於隱藏位,它是24位:標準化數字爲1,非標準化數字爲0。 – fredoverflow 2011-02-16 09:55:56

5

閱讀this

「每個計算機科學家應該知道浮點什麼」

http://www.validlab.com/goldberg/paper.pdf

+0

浮點算術已經聲稱另一個受害者!它似乎被它咬了一口,對每一個程序員來說都是一些禮儀。 :) – 2011-02-16 09:49:55