为什么我的小数字没有被准确存储?
Why is my very small number not being stored precisely?
在 answer on Whosebug 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.09
和 perl6/rakudo-star-2015.11
得到相同的答案
分母应该被限制为 64 位 - 你需要一个 FatRat
来超越它。
但是,在当前的 Rakudo 中似乎并未强制执行上述限制:如果您手动执行此操作,它将很乐意通过 Rat.new(71, 10**23)
.
构建您的号码
我的猜测是您发现了有理文字处理中的一个错误,但它可能只会在无法面向未来的代码中触发。
编辑: 可以使用尖括号使 allomorphic value, and this produces the correct value. In fact, regular rational literals are also specced 在溢出时退回到 RatStr
。
然而,这种回退机制似乎并没有在 Rakudo 中实现。
在 answer on Whosebug 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.09
和 perl6/rakudo-star-2015.11
分母应该被限制为 64 位 - 你需要一个 FatRat
来超越它。
但是,在当前的 Rakudo 中似乎并未强制执行上述限制:如果您手动执行此操作,它将很乐意通过 Rat.new(71, 10**23)
.
我的猜测是您发现了有理文字处理中的一个错误,但它可能只会在无法面向未来的代码中触发。
编辑: 可以使用尖括号使 allomorphic value, and this produces the correct value. In fact, regular rational literals are also specced 在溢出时退回到 RatStr
。
然而,这种回退机制似乎并没有在 Rakudo 中实现。