2015-12-04 123 views
2

answer on StackOverflow en Español中,我發現Perl 6避免了許多其他語言的計算錯誤,因爲它跟蹤分子和分母。也就是說,十進制數字實際上表示爲比率。然而,它確實對很小的數字產生一個小錯誤:爲什麼我的小號碼沒有被準確存儲?

> 0.000000000000000000071.nude.perl 
(71, 1000000000000000000000) 
> 0.0000000000000000000071.nude.perl 
(71, 10000000000000000000000) 
> 0.00000000000000000000071.nude.perl 
(71, 99999999999999991611392) 

這是什麼東西,將在未來版本中修復?

我得到使用相同的答案perl6/rakudo-star-2015.09perl6/rakudo-star-2015.11

+4

這應該是一個錯誤,或轉換爲數字。大鼠應該只有'uint64.Range.max'分母。 18446744073709551615(20位數字)如果你想要一個與分母大的Rational,使用FatRat。 'FatRat.new(71,10²³)'或'71.FatRat /10²³' –

+0

@BradGilbert:+1 - 我在寫我的答案時還沒有看到您的評論:( – Christoph

回答

4

分母應該被限制在64位 - 你需要一個FatRat點到爲止。

但是,上述限制似乎並未在當前Rakudo中強制執行:如果您手動執行此操作,它將很樂意通過Rat.new(71, 10**23)構建您的號碼。

我的猜測是你已經發現了處理合理文字的錯誤,,但它可能只會在代碼中觸發,無論如何不是未來的證明。

編輯:可以使用尖括號來獲得allomorphic value,這會產生正確的值。實際上,在溢出時,常規合理字面值爲also specced回落到RatStr

但是,這種回退機制似乎並未在Rakudo中實施。

+1

謝謝!根據DWIM思考,我們希望Perl 6知道我們需要FatRat並使用它,或者是否存在另一個潛在的問題? –

+1

@ChristopherBottoms:Perl6文字通常是單形的而不是DWIM;但是,有尖括號語法'<0.5>'這樣做可能可以擴展爲在適當的時候返回一個'FatRatStr'而不是'RatStr' – Christoph

+1

Sweet!'<0.00000000000000000000000000000000000000000000000000000000000000000071> .nude.perl'給出'(71,100000000000000000000000000000000000000000000000000000000000000000000)' –

相關問題