4

对于一个科学博览会项目,我正在测试您选择的编程语言如何影响性能。我通过用 Java、Ruby、Perl 和 Python 编写脚本来计算 Pi 到小数点后 1 亿位。我从 Perl 开始,因为我最熟悉 Perl。然而,这带来了一个有趣的问题。我需要在 Perl 中将 Pi 舍入到第 100 位,但据我所知,Perl 对于这种情况没有好的舍入方法。只有这样的东西

use Math::Round;
$rounded = nearest(0.1, $numb);

这有点问题,因为我不想坐在电脑前输入 1 亿个零。据我所知, sprintf 和 printf 也好不到哪里去。另外,他们有那令人讨厌的一半。任何人都可以帮忙吗?

PS 我打算使用 Chudnovsky 公式,如果这对任何人都很重要。

4

3 回答 3

5

我认为任何编程语言都不能以原生方式完成您的要求。甚至像 Math::BigRat (默认 40 位)和 Math::Bignum 这样的 bignum 库也无法处理 1 亿位。

为了实现它,您必须创建自己的自定义方式来表示如此大的数字以及如何将它们四舍五入。

于 2012-12-19T06:21:16.513 回答
3

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

反而,

  1. 使用 Chudnovsky 公式计算 1E8 +1 位数。
  2. 将数字存储在字符串(如果您有内存)或文件中。
  3. 选择最后 n 位(8 位甚至 2 位之类的小数字)。
  4. 如果它们不是全部 9 到 n-1 位数。
  5. 如果将它们转换为 (n-1) * 0 位。然后从末尾读取接下来的 n 位数字并重复 4 和 5。

但是,如果目标是通过生成 1E8 位 Pi 来测试语言的相对性能,那么为什么还要关注对这个数字进行舍入的相当人为的约束。如果您使用相同的算法,那么任何语言都应该产生相同的结果。无论如何,你有 50% 的机会生成一个四舍五入的数字。

于 2012-12-19T10:56:50.433 回答
2

这更近了一步(尽管我还没有测试它是否可以处理 1 亿个零)。您需要使用bignum来处理这些数字。

use bignum;
use Math::Round;

$rounded = nearest(1e-100_000_001, $numb);

此外,bignum具有自己的pi功能和精度参数:

$rounded = bignum::bpi(100_000_001);
于 2012-12-19T06:16:39.267 回答