对于Science Fair项目,我正在测试您选择的编程语言如何影响性能。我这样做是通过用Java,Ruby,Perl和Python制作脚本来计算Pi到第1亿位小数。我从Perl开始,因为我对Perl最熟悉。然而,这给桌子带来了一个有趣的问题。我需要将Pi轮到Perl中的第1亿位,但据我所知,Perl对于这种情况没有很好的舍入方法。只有像
这样的东西use Math::Round;
$rounded = nearest(0.1, $numb);
这有点问题,因为我不想坐在我的电脑上打字1亿个零。据我所知,sprintf和printf没有任何好转;另外,他们有那个讨厌的事情。任何人都可以帮忙吗?
P.S。如果对任何人都很重要,我打算使用Chudnovsky Formula。
答案 0 :(得分:5)
我认为任何编程语言本身都不能满足您的要求。即使像Math :: BigRat(默认40位)和Math :: Bignum这样的bignum库也不能做1亿位数。
要实现这一目标,您必须创建自己的自定义方式来表示如此大的数字以及如何舍入它们。
答案 1 :(得分:3)
以另一种方式思考问题。您需要舍入到1亿(1E8)个数字,但您不需要一次性处理所有1E8数字。
相反,
但是,如果目标是通过生成Pi的1E8位数来测试语言的相对性能,那么为什么还要关注舍入该数字的相当人为的约束。如果使用相同的算法,那么任何语言都应该产生相同的结果。而且你有50%的几率产生一个舍入数字。
答案 2 :(得分:2)
这又近了一步(尽管我还没有测试它是否可以处理1亿个零)。您需要使用bignum来处理这些数字。
use bignum;
use Math::Round;
$rounded = nearest(1e-100_000_001, $numb);
此外,bignum
还有自己的pi
函数,其中包含精度参数:
$rounded = bignum::bpi(100_000_001);