2016-03-03 110 views
0

我以爲Erlang處理任意的精度整數。但它看起來像math.pow使用花車默認:Erlang; math.pow,爲什麼不是默認的整數或爲float/int輸入?

使用Linux工具bc

88^99 
31899548991064687385194313314353745484864573065650712770111884048604\ 
75359372836550565046276541670202826515718633320519821593616663471686\ 
151960018780508843851702573924250277584030257178740785152 

刪除反斜槓:

3189954899106468738519431331435374548486457306565071277011188404860475359372836550565046276541670202826515718633320519821593616663471686151960018780508843851702573924250277584030257178740785152 

在二郎:

float_to_list(math:pow(88,99),[{scientific,192}]). 
"3.189954899106468677983468001676918389478607432406058411199358053788184470654582587122118156926366989707830958889227847846886750593566290713618113587727930256898153980172821794148406939795587072e+192" 

方旁邊:

bc: 3189954899106468738519431331435374548486457306565071277011188404860475359372836550565046276541670202826515718633320519821593616663471686151960018780508843851702573924250277584030257178740785152 
erl: 3189954899106468677983468001676918389478607432406058411199358053788184470654582587122118156926366989707830958889227847846886750593566290713618113587727930256898153980172821794148406939795587072 

我寫了一個天真的功能:

integerpow(N, 1) -> N; 
integerpow(N, M) -> N*integerpow(N, M-1). 

產生正確的答案。

但是它似乎默認行爲,當兩個參數都在整數應產生正確的答案,爲什麼不是

回答

5

因爲math模塊只包裝了C庫中的內容。作爲the manual page說:

錯誤

因爲這些是C函數庫,錯誤是一樣的。

(雖然你可能會質疑是否返回一個浮點數,而不是一個BIGNUM的是一個「錯誤」)

這也是什麼pow類型簽名說:

pow(X, Y) -> float() 

    Y = X = number() 

也就是說,該函數被指定爲接受任何數字,即整數和浮點數,但總是返回一個浮點數。


那爲什麼呢?

我無法找到任何權威性的答案,以確定是否會接受將標準庫中添加冪指數函數的貢獻,因此請嘗試並提交請求! (或者an EEP。)

雖然我沒有找到an alternative implementation郵件列表上的二郎-問題(返回相同的類型爲基準參數的值),並a Stack Overflow question上類似的話題,和mailing list thread討論如何使用非常大的數字,即使對於貴族來說也大於可行。

0

Erlang,就此而言,任何庫,甚至簡單的計算器,都不會通過多次天真地乘數來計算大的整數。他們使用一個稱爲Exponentiation_by_squaring的特定數學公式。它通過多項式近似來計算功率。對於小數字,近似值是精確的,但對於更大的數值,它的精確度越來越低,它當然取決於底層庫中實現的精度。math library in Erlang是與underlying C implementation類似的NIF代理。

編輯:

這似乎是一個duplicate of this question

math.stackexchange.com上還有一個關於computation algorithm引用相同來源的問題。

所以,你已經在問題本身中回答了你的問題。 Erlang處理任意的精度整數,但模塊math沒有,它默認使用float

+0

這個答案基本上說「答案是錯誤的,因爲他們覺得高效而不正確」。 – Tommy

+0

是的,數學是如何實現的。它使用浮點數來計算權力並返回近似結果,就像所有使用浮點數的庫一樣。 Erlang虛擬機本身可以處理大整數,但並不意味着所有的OTP庫都會這樣做。我用更多鏈接添加了對我的回覆的編輯。 – Amiramix

相關問題