2014-07-22 54 views
5

現在,浮點數和雙精度數字儘管可以近似任何數字類型(雖然同樣可以說整數,但浮點數更精確),它們在內部表示爲二進制小數。例如,十分之一就可以近似如何從浮點數中提取二元分數

0.00011001100110011... (... only goes to computers precision, not infinity) 

現在,任何在數學上稱爲dyadic fraction表示數量有限位的東西二進制(無關與對ADIC)。這意味着您將其表示爲分數,分母是2的冪。例如,假設我們的計算機接近0.00011的十分之一。二進制分數爲3/323/(2^5),接近十分之一。現在我的技術問題。 從浮點數中提取二元分數的最簡單方法是什麼?

不相關注意:如果你想知道爲什麼我想要這樣做,那是因爲我在Haskell中創建了一個超現實的數字庫。同餘分數很容易被翻譯成超現實的數字,這就是爲什麼二進制很容易被翻譯成二元的原因(雖然我肯定會遇到有理數的問題)。

+1

對於Haskell的超現實數字庫+1。 –

+0

它只會是這樣的左右設置是可數的Surreals。 – PyRulez

+0

也許只有左側和右側集合可計算枚舉的那些,但對任何人都應該足夠了。 :) –

回答

5

decodeFloat函數似乎對此很有用。從技術上講,你也應該檢查floatRadix是2,但是據我所知,這在GHC中總是如此。

只要小心,因爲它不會簡化尾數和指數。在這裏,如果我評估decodeFloat (1.0 :: Double),我得到-52的指數和2^52的尾數,這不是我所期望的。並且,toRational似乎產生二元分數。不過,我不確定情況總是如此。

+0

那麼,所有IEEE-754浮點值*都是*二進制分數。所以如果toRational總是確切的,那麼它的輸出將是。 – Carl

+0

是的,toRational是準確的。 – augustss

相關問題