2017-02-22 39 views
1

我們無法以無限精度存儲小數,但可能有某種表示方式,就像我們在haskell中表示無限列表一樣。未來有沒有解決浮點數精度問題的想法?

第一個想法來找我是通過類似於CODATA東西來表示一個十進制數,所以,對於任何給定的自然數k,我們可以計算出十進制數精確到k位。

但有一些明顯的問題,想想數a = 0.333...b = 0.666...,如果我們加在一起,我們得到了ans = 0.999...(數字序列),但我們絕不能不管a + b == 1在這種情況下告訴。

我想是,以某種方式定義十進制數,所以它支持+-*/>==操作,而且不管什麼+-*,我們應用到這些/操作十進制數字,我們得到新的十進制數字,我們可以將它們精確計算爲給定任意自然數k的k個數字。

我在想:是否有任何想法可以解決這個問題?

+1

你見過http://hackage.haskell.org/package/cyclotomic嗎? – jkeuhlen

+3

我不確定你的要求是明確的。有可能'Rational'就是你想要的;它支持所有這些操作而不會失去精度(你將無法用它們構造一個不合理的數字) – jberryman

+2

更一般地說,你永遠不能做「x == y」,因爲無論你計算多少位數字都永遠無法確定下一個不會有所不同。實際的解決方案似乎是有數字家族,以便程序員可以選擇他們想要的。 –

回答

5

Haskell爲進行精確算術而提供Rational,CyclotomicCReal

CReal,可計算實數,儘可能接近表示真實數字的機器;幾乎任何你能想到並描述的實際數字都可以填入CReal。能夠代表很多事情的權衡是你的觀察力受到嚴重限制。檢查是否平等,檢查一個人是否比另一個人大,即使知道第一個數字應該是什麼是技術上不可解釋的問題;儘管Hackage提供的軟件包提供了所有這些觀察的近似算法。

Cyclotomic可以代表一個小得多的實數,並且可以代表複數的一大塊,同時保留精確的計算,並以可決定的方式支持更多的觀測值。你想要做的很多事情都可以用分圓數來完成。

Rational代表可以寫成分數的所有數字。這是一個比CRealCyclotomic要小很多的實數:平方根(和其他根)幾乎不在,三角函數幾乎不在,pi和e在外等等。但是觀察結果相對於CRealCyclotomic,所以他們有時只是票。

......當然,如果效率很重要的話,Double會用今天的硬件把所有這些衝出水面。仔細選擇你的毒藥!

+1

哪裏(即哪個Hackage包)是這個'CReal'類型代表[可計算實數](https://en.wikipedia.org/wiki/Computable_number)?也許你的意思是['建設性'](https://hackage.haskell.org/package/numbers-3000.2.0.1/docs/Data-Number-CReal.html#t:CReal)? (很好的回答,我真的很好奇,如果有一個着名的Haskell實現可計算實數,我一直都不知道......) – user2407038

+0

@ user2407038據我所知,「建設性的實在」是「可計算實數」的同義詞。 –

+0

我的理解是,'具有建設性的'實體具有「確切地知道第一個數字應該是[技術上不可判定的](如你在答案中所述)的性質,至少對於任意的具有建設性的實在,但'可計算的'實數具有該屬性「我們可以將它們精確地計算爲給定任意自然數k的k個數字。」 (如OP所述)。構造性實數表示實際的實數集,而可計算實數只是實數的(密集)子集。這兩個是不同的,但我不確定哪個數據CReal = CR(Int - > Integer)對應。 – user2407038

相關問題