出于纯粹的兴趣,我很好奇如何顺序创建PI,以便在流程本身生成时显示这些数字,而不是在流程结果之后生成数字。如果是这种情况,那么这个数字就可以产生它自己,我可以对以前看到的数字进行垃圾回收,从而创建一个无限级数。结果只是跟随Pi系列的每秒产生一个数字。

这是我发现通过互联网筛选的内容:

这是流行的计算机友好算法,类似于Machin的算法:

def arccot(x, unity)
   xpow = unity / x
   n = 1
   sign = 1
   sum = 0
   loop do
       term = xpow / n
       break if term == 0
       sum += sign * (xpow/n)
       xpow /= x*x
       n += 2
       sign = -sign
   end
   sum
end

def calc_pi(digits = 10000)
   fudge = 10
   unity = 10**(digits+fudge)
   pi = 4*(4*arccot(5, unity) - arccot(239, unity))
   pi / (10**fudge)
end

digits = (ARGV[0] || 10000).to_i
p calc_pi(digits)

最佳答案

要进一步扩展“Moron的答案”:Bailey-Borwein-Plouffe公式为您提供的功能是,您可以计算pi的二进制(或等效十六进制)数字,而无需计算之前的所有数字。十年前,此公式用于计算the quadrillionth bit of pi。它是0。(我确定您是坐在座位的边缘来找出答案的。)

这与计算pi的位或数字的低内存动态算法不同,我认为您可以“按顺序”表示。我不认为任何人都知道如何在10进制或2进制中执行此操作,尽管BPP算法可以看作是部分解决方案。

好吧,从某种意义上说,有一个迭代每次循环产生更多的数字,pi的一些迭代公式也有点像顺序算法。但是,这也只是部分解决方案,因为通常每一步数字的位数是两倍或三倍。因此,您将等待很多数字一段时间,然后很快就会出现更多数字。

实际上,我不知道是否有任何低内存,高效的算法来产生任何标准无理数的数字。即使对于e,您也会认为标准无穷级数是一个有效的公式,它是低内存的。但是,它在一开始看起来只是内存不足,实际上,还有更快的算法可以计算e的许多位数。

关于ruby - 如何在Ruby中顺序创建PI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3137594/

10-15 12:21