不管我把D定得多高,似乎
测试足够数量的
数字找到一个其中公式
返回不正确的值。
如果您测试足够数量的数字,您总是会收到错误 - 该算法不使用任意精度,因此最终会出现舍入错误。
当数字不改变时,带有中断的无界迭代将很难确定给定数字位数所需的最小精度。
您最好的选择是凭经验确定它,理想情况下是通过与已知的正确源进行比较,并增加位数精度直到匹配,或者如果没有正确的源,则从最大精度开始(我猜是 14 ,因为第 15 位几乎总是包含舍入误差。)
编辑:更准确地说,该算法包括一个循环 - 从 0..n 开始,其中 n 是要计算的数字。循环的每次迭代都会引入一定量的误差。循环足够次数后,错误将侵入您正在计算的最高有效位,因此结果将是错误的。
维基百科文章使用 14 位精度,这足以正确计算 10**8 位。正如您所显示的,较少的精度位数会导致较早发生错误,因为精度较低,并且迭代次数较少,错误就会变得可见。最终结果是,随着精度位数的减少,我们可以正确计算数字的 n 值会变低。
如果精度为 D 个十六进制数字,则为 D*4 位。每次迭代时,最低有效位都会引入 0.5 位的错误,因此经过 2 次迭代,LSB 有可能出错。在求和过程中,这些误差被相加,从而累积起来。如果错误总数达到最高有效位的LSB,那么您提取的个位数将是错误的。粗略地说,就是当 N > 2**(D-0.75) 时。 (纠正一些对数底数。)
根据经验推断您的数据,似乎近似拟合为 N=~(2**(2.05*D)),尽管数据点很少,因此这可能不是准确的预测变量。
您选择的 BBP 算法是迭代的,因此计算序列中的数字将花费越来越长的时间。要计算数字 0..n,需要O(n^2)
steps.
维基百科文章给出了一个计算第 n 位数字的公式,不需要迭代,只需要求幂和有理数。这不会遭受与迭代算法相同的精度损失,并且您可以根据需要在恒定时间内计算 pi 的任何数字(或者最坏的对数类型,取决于模数求幂的实现),因此计算n
数字将采取O(n)
时间可能为 O(n log n)。