2013-02-04 43 views
0

我知道將二進制數字轉換爲浮點數時可能會出現問題。計算將小數轉換爲浮點時哪些數字會導致問題?

例如:1.4結果在1.39999。 6.2是6.1999999,6.6是6.599999等

有沒有辦法計算哪些數字會導致這些問題?就像創建一些電子數據表或數據庫的數字從1-50,000不準確轉換?

+0

你是什麼意思,從二進制轉換爲浮點?在一天結束時,所有內容都以二進制格式保存。浮點只是二進制格式的一個例子。 – paul

+0

我的意思是這樣的計算器:http://www.h-schmidt。net/FloatConverter/IEEE754.html 當你輸入十進制數字6.2時,你會得到6.1999 – user2039871

+0

即使你有這樣一個列表,你幾乎不可能永遠避免這些數字。在計算日益容易出錯的計算和轉換的情況下,應該使用'decimal'數據類型並且保持「float」不變。 –

回答

0

幾乎所有的數字都很麻煩。最小的例外是那些反覆乘以2得到小數部分並且小於2^24的結果。

例如

0.125 -> 0.25 -> 0.5 -> 1.0 ! OK 
6.4 --> 12.8 --> 25.6 -> 51.2 -> 102.4 : we got a cycle! (.4 .8 .6 .2 ...) 

編輯

鑑於這一問題的目的/背景下,似乎不精確時浮點會向零舍搗亂。

例如

10.2 == 10.199999809, when the next floating point would be 
next == 10.200000763 <-- the difference to the wanted value is ~4 times higher 
vs. 
10.3 == 10.300000197, when the previous (rounded down fp would be) 
prev == 10.299992370, <-- this would have been also ~4x further from away 

也許是時候談數控驅動器的程序員......

+0

所以它基本上是任何小數。 .1,.2,.3等。除.5以外,它們都不是確切的 – user2039871

+0

。所有其他人都有無限的二進制數字擴展,但是在截斷點之後,他們中的很多人都有足夠的零,所以他們最終被正確打印。 –

1

的誤差在浮點計算的根源在於浮點數的存儲方式。取決於你使用的精度(通常是單精度(浮點)或雙精度)。雙精度浮標占用更多空間,但大致精確一倍。

浮點數通常以IEEE格式存儲,因此只包含最高有效位。

在以這種方式存儲以表示浮點數的一串位中,有不同的部分組成該數字。首先,有一個表示數字是正數還是負數的符號位。接下來,存儲該數字的指數部分(在單精度浮點數中,這需要8位)。指數後,所有剩餘的位代表數字的有效數字。因此,1 10000000 01000000000000000000000位表示-0.5符號位(第一個)表示該數字爲負數。接下來的八位是指數。通常,指數存儲有偏差,因此除了大數字之外,還可以精確地存儲小數字。爲此,用於計算的指數是-127(如果是8位指數)+指數位被解釋爲整數(在本例中爲128)。所有剩餘的位表示從一個地方開始並從那裏向右移動的數字的有效數字,我們每次減半(1是1,但01是1/2和001是1/4),在我們的情況下總數爲-0.5(對於符號位爲-1(對於指數爲2)*對於其餘位,對於指數* 0.5爲0.5)

作爲進一步示例,here是使用複選框來指示比特的轉換器。最糟糕的是,你可以寫一個機器人來測試你所關心的所有組合。

一般來說,如果它不能用一個不是直接由兩個冪的組合構成的分數來描述,它將被舍入。 (如果你不能用1/2 + 1/4 + 1/8等得到它,它可能會舍入)

+0

是的我熟悉這個頁面。我只想找到一種方法來記錄所有在一定範圍內存在問題的數字。我使用它來進行CNC編程,當我們輸入6.2時,機器不會實際運行。所以我想在數據庫/電子表格中記錄問題# – user2039871

+0

找到可以使用的數字可能會更容易,而不是那些你不能使用的數字。在這個方向上,你可以通過嘗試每個位模式來獲得所需範圍內的數字並將結果存儲爲可以使用的數字。否則,您可以選擇一個您想要知道哪些數字將會舍入的比例(例如1.1,1.2,1.3,1.4,...或1.01,1.02,1.03,...),並嘗試輸入那些當轉換爲字符串與您輸入的壞數字不一樣。 – Psetmaj