将Perl中的Pi舍入到第1亿位小数位?

时间:2012-12-19 05:36:12

标签: perl rounding pi

对于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。

3 个答案:

答案 0 :(得分:5)

我认为任何编程语言本身都不能满足您的要求。即使像Math :: BigRat(默认40位)和Math :: Bignum这样的bignum库也不能做1亿位数。

要实现这一目标,您必须创建自己的自定义方式来表示如此大的数字以及如何舍入它们。

答案 1 :(得分:3)

以另一种方式思考问题。您需要舍入到1亿(1E8)个数字,但您不需要一次性处理所有1E8数字。

相反,

  1. 使用Chudnovsky公式计算1E8 +1位数。
  2. 将数字存储在字符串中(如果有内存)或文件。
  3. 选择最后一个n(小于8或甚至2的数字)数字。
  4. 如果它们不是全部9轮到n-1位数。
  5. 如果他们然后将它们转换为(n-1)* 0位数。然后从末尾读取下n个数字,并重复4和5。
  6. 但是,如果目标是通过生成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);