我想在低内存环境下计算圆周率的第n位。由于我没有小数点,所以这个使用Python的仅整数BBP算法 是一个很好的起点。我只需要一次计算一个数字。如何确定我可以设置D的最小值,即“工作精度的位数”?D=4给了我很多正确的数字,但是有几个数字会偏差1。例如,使用精度为4计算第393位数字,得到0xafda,从中提取出数字0xa。然而,正确的数字是0xb。无论我将D设置得多高,似乎测试足够数量的数字都会找到一个公式返回不正确值的数字。
我尝试在数字“接近”另一个数字时提高精度,例如0x3fff或0x1000,但是找不到“接近”的好定义;例如,在第9798位计算会得到0xcde6,它与0xd000并不非常接近,但正确的数字是0xd。 有人能帮我确定使用此算法计算给定数字需要多少工作精度吗? 谢谢, 编辑
参考:
我尝试在数字“接近”另一个数字时提高精度,例如0x3fff或0x1000,但是找不到“接近”的好定义;例如,在第9798位计算会得到0xcde6,它与0xd000并不非常接近,但正确的数字是0xd。 有人能帮我确定使用此算法计算给定数字需要多少工作精度吗? 谢谢, 编辑
参考:
精度(D) 第一个错误数字 ------------- ------------------ 3 27 4 161 5 733 6 4329 7 21139 8+ ???
请注意,我一次只计算一个数字,例如:
for i in range(1,n):
D = 3 # or whatever precision I'm testing
digit = pi(i) # extracts most significant digit from integer-only BBP result
if( digit != HARDCODED_PI[i] ):
print("non matching digit #%d, got %x instead of %x" % (i,digit,HARDCODED_PI[i]) )