【问题标题】:Arbitrary precision arithmetic with GMP使用 GMP 的任意精度算术
【发布时间】:2011-06-20 16:54:08
【问题描述】:

我正在使用 GMP 库制作一个 Pi 程序,它将计算大约 7 万亿位数的 Pi。问题是,我不知道需要多少位来保存这么多小数位。

【问题讨论】:

  • 如果您不需要所有数字,可以查看this algorithm
  • 你不懂很多数学,也许从更简单的开始。使用通用库计算数万亿个 Pi 数字将花费大量时间。

标签: c++ gmp arbitrary-precision


【解决方案1】:

7 万亿位可以表示 10^(7 万亿) 个不同数字中的任何一个。

x 位可以表示 2^x 个不同的数字。

所以你要解决:

2^x = 10^7000000000000

取两边的log-base-2:

x = log2(10^7000000000000)

回想一下log(a^b) = b * log(a)

x = 7000000000000 * log2(10)

我得到23253496664212 位。为了安全起见,我会再添加一两个。不过,祝你好运找到 PB 来保存它们。

我怀疑你需要一个更有趣的算法。

【讨论】:

  • 每个 23 太比特,实际上......但是,我只需要知道我需要多少比特,我找不到答案,但后来你过来给了,而不是只是一个答案,而是一个解释!太棒了,先生,太棒了!
【解决方案2】:

我只想更正回复答案中写的一件事:

回想一下 log(a^b) = a * log(b)

正好相反:

log(a^b) = b * log(a)

【讨论】:

    【解决方案3】:

    2^10 = 1024,所以十位代表略多于三位。既然你说的是 7 万亿位数字,那将是 23 万亿位或大约 3 TB,这比我上次访问 Costco 的一个驱动器所能得到的还要多。

    您可能过于雄心勃勃。我想知道每次操作读取和写入整个磁盘的 I/O 时间。

    (解决它的数学方法是使用对数,因为一个需要 7 万亿位数字表示的数字的对数底数为 10 约为 7 万亿。在现有底数中找到数字的对数,转换底数,你得到了答案。对于以 2 和以 10 为底的速记,使用十位 == 三位数,因为这并没有太大的错误。它说 2 的以 10 为底的对数是 0.3,而实际上更像.301.)

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2013-02-09
      • 2011-02-21
      • 2015-10-29
      相关资源
      最近更新 更多