Bailey–Borwein–Plouffe迭代
我们已经在PPCG上看到了几个pi挑战,但是没有一个挑战明确指出了您应该使用的算法。我想看看Bailey–Borwein–Plouffe算法在迭代之前使用任何语言的实现n
。计算公式如下:
您的算法应将每次迭代最多输出n次,显示中间和以及最终结果以形成“三角形”。您也可以使用维基百科页面上显示的算法的简化多项式形式。运行示例n=50
如下所示:
3
3.1
3.14
3.141
3.1415
3.14159
3.141592
3.1415926
3.14159265
3.141592653
3.1415926535
3.14159265358
3.141592653589
3.1415926535897
3.14159265358979
3.141592653589793
3.1415926535897932
3.14159265358979323
3.141592653589793238
3.1415926535897932384
3.14159265358979323846
3.141592653589793238462
3.1415926535897932384626
3.14159265358979323846264
3.141592653589793238462643
3.1415926535897932384626433
3.14159265358979323846264338
3.141592653589793238462643383
3.1415926535897932384626433832
3.14159265358979323846264338327
3.141592653589793238462643383279
3.1415926535897932384626433832795
3.14159265358979323846264338327950
3.141592653589793238462643383279502
3.1415926535897932384626433832795028
3.14159265358979323846264338327950288
3.141592653589793238462643383279502884
3.1415926535897932384626433832795028841
3.14159265358979323846264338327950288419
3.141592653589793238462643383279502884197
3.1415926535897932384626433832795028841971
3.14159265358979323846264338327950288419716
3.141592653589793238462643383279502884197169
3.1415926535897932384626433832795028841971693
3.14159265358979323846264338327950288419716939
3.141592653589793238462643383279502884197169399
3.1415926535897932384626433832795028841971693993
3.14159265358979323846264338327950288419716939937
3.141592653589793238462643383279502884197169399375
3.1415926535897932384626433832795028841971693993751
3.14159265358979323846264338327950288419716939937510
每次迭代的精度应等于n
传递给算法的精度,也就是说,每次迭代都应计算pi直到n
所有都传递k
。
规则:
- 不允许内置,也
pi
必须使用公式。 n
就计算而言,您必须支持您的语言所允许的最大限制16^n
。如果输入在x<n
执行后的计算过程中引起算术溢出,因为您的语言仅支持小数,最高为2^32-1
。任何其他假设n
均不可行。- 如果输出不明显,则必须提供有关如何获得输出的说明。例如,如果您以高尔夫球语言发布,则需要100%细分。这是为了确保您正在使用指定的算法。
- 不允许使用标准漏洞。
- 这是代码高尔夫球,此处的最低字节数获胜。
参考代码(用于生成示例的代码):
public static void main(String[] args) {
(0..50).each {
n->
def x=(0..n).collect {
j->
def k=new BigDecimal(j)
def s={it.setScale(n)}
def a=s(1.0g).divide(s(16.0g)**s(k))
def b=s(4.0g)/(s(8.0g)*s(k)+s(1.0g))
def c=s(2.0g)/(s(8.0g)*s(k)+s(4.0g))
def d=s(1.0g)/(s(8.0g)*s(k)+s(5.0g))
def e=s(1.0g)/(s(8.0g)*s(k)+s(6.0g))
def f=a*(b-c-d-e)
}.sum()
println(n + "\t" + x.setScale(n, BigDecimal.ROUND_DOWN))
}
}
此实现的上限为n=255
,您可以限制为更多或更少。
该实现是在Groovy中完成的。
Calculate foo via x method
难题。