2013-03-11 107 views
0

如何準確地解析十進制值?也就是說,我有一個字符串的值,如「43.879」,我希望得到一個確切的GMP值。我從文檔中不清楚如何,或者這是否實際可行。它似乎不適合整數/有理數/浮點值類型 - 儘管也許可以用理性來扭曲。用GMP解析十進制值?

我的意圖是在像加法和減法這樣的操作上保留精確的精度小數,但切換到像分割或指數這樣的操作的高精度浮點。

回答

0

大多數圖書館給你任意大的精度,包括GMP。然而,即使有很高的精度,也有一些數字不能完全用二進制格式表示,與你無法用十進制表示1/3相同。對於許多應用程序將精度設置爲較高的數值(如10),進行計算,然後將結果四捨五入爲期望的精度,如3個作品。它不適合你嗎?請參閱本 - Is there a C++ equivalent to Java's BigDecimal?

你也可以使用http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library

*********編輯

精確表示不二進制浮點許多數字存在;大多數當前浮點庫提供的類型。像0.1這樣的數字不能被表示爲二進制數字,無論精度如何。

爲了能夠做到你所建議的圖書館必須做的「手工添加」,「手劃分」等同於你在鉛筆和紙張上添加兩個十進制數字。例如要存儲0.1,庫可能選擇將其表示爲一個字符串本身,然後對字符串進行添加。毋庸置疑,一個幼稚的實施會使這個過程變得非常緩慢 - 數量級緩慢。要添加0.1 + 0.1,它必須解析字符串,添加1 + 1,記住進位,記住小數位等。這是計算機微代碼在幾個CPU週期(或單個指令)中爲您執行的操作。而不是單一的指令,你的軟件庫最終會花費100個CPU週期/指令。

如果它試圖將0.1轉換爲數字,它將回到方形1 - 0.1不能是二進制數字。

但是人們確實認識到需要精確地表示0.1。只是二進制數字表示不會這樣做。這就是更新的浮點標準進入的地方,那就是intel小數點庫的發展方向。

重複我之前的例子,假設你有一臺可以做10個基數的10臺計算機。該計算機無法將1/3存儲爲「普通」浮點數。它必須存儲數字爲1/3的表示。相當於它如何寫在紙上。嘗試在紙上寫入1/3作爲基本10浮點數。

另請參閱Why can't decimal numbers be represented exactly in binary?

+0

是的,我明白這一點。我只是想精確地表示從十進制形式的字符串解析的數字。這保證了對於那些人來說必須存在一個確切的表示形式,無論是作爲一個有理數,還是整數乘以十的冪。我只是想知道如何獲得在GMP中分析的數字(因爲理性不公開這樣的解析器)。 – 2013-03-11 08:41:31

+0

許多數字的二進制浮點不存在精確表示;大多數當前浮點庫提供的類型。像0.1這樣的數字不能被表示爲二進制數字,無論精度如何。 但是,人們確實認識到需要精確地表示0.1。只是二進制數字表示不會這樣做。這就是更新的浮點標準進入的地方,那就是intel小數點庫的發展方向。 – Amit 2013-03-11 13:28:44

+0

GMP有一個「理性」類,其中0.1可以完全表示爲1/10。我正在尋找一種標準的方法來解析十進制數字到這種形式(假設理性是正確的形式)。 – 2013-03-11 14:36:04