BBP 算法所需的工作精度?

2024-03-03

我希望在低内存环境中计算 Pi 的第 n 位数字。由于我没有可用的小数,这Python 中的纯整数 BBP 算法 http://en.literateprograms.org/Pi_with_the_BBP_formula_%28Python%29#Using_integer_arithmetic是一个很好的起点。我一次只需要计算 Pi 的一位数。如何确定可以设置的最低“工作精度位数”D?

D=4 给出了许多正确的数字,但有几个数字会少一位。例如,以 4 的精度计算数字 393 会得到 0xafda,我从中提取数字 0xa。然而,正确的数字是0xb。

无论我将 D 设置得有多高,似乎测试足够数量的数字都会发现公式返回错误值的数字。

当数字“接近”另一个数字时,例如,我尝试提高精度0x3fff或0x1000,但找不到“关闭”的任何好的定义;例如,计算数字 9798 会得到 0xcde6 ,与 0xd000 不太接近,但正确的数字是 0xd。

谁能帮我算出使用该算法计算给定数字需要多少工作精度?

谢谢你,

编辑
以供参考:



precision (D)   first wrong digit
-------------   ------------------
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]) )

不管我把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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BBP 算法所需的工作精度? 的相关文章

随机推荐

  • Angular 6:无法正确设置http标头的Content-Type

    我正在尝试使用 Angular 6 中的 HttpHeader 进行后调用 并将 Content Type 设置为 application json 但服务器获取的是 x www form urlencoded 而不是 applicatio
  • ASP.Net MVC 中的 LDAP 身份验证

    我希望能够使用域用户 ID 和密码对用户进行身份验证 但默认的 ASP Net MVC 应用程序允许用户注册用户 ID 和密码然后登录 我该如何执行此操作 我不希望用户能够注册 但是 他应该能够输入他的 Windows 域用户 ID 和密码
  • 解包可选值 WKWebView 获取参数时意外发现 nil

    我在 WKWebView 上工作 当我加载没有像这样的参数的 url 时 它工作正常 func loadAddress lat Double lng Double let requestURL NSURL string http url c
  • python 装饰器 *args 和 ** kwargs

    我对编码是全新的 我一直在努力吸收尽可能多的东西 我不明白你们发布的很多技术解释 所以请尽量用简单的英语 我了解装饰器函数如何工作的机制 但我的问题是遵循代码逻辑 特别是为什么我们必须添加 args 和 kwargs 声明我们传递给带有参数
  • Visual Studio 将项目移动到不同的文件夹

    如何将项目移动到 Visual Studio 中的其他文件夹 我在项目中已经习惯了这种结构 app Project Something Project SomethingElse 我想将整个命名空间 SomethingElse 重命名为 S
  • Intent.FLAG_ACTIVITY_CLEAR_TASK 的替代方案

    我有两个应用程序 App B 启动 App A 如果用户从应用程序 A 内部启动应用程序 B 我会在应用程序 A 上调用完成 所以我没有问题 如果用户从应用程序抽屉直接进入应用程序 B 或长按主页按钮 那么我会执行以下操作 首先清除应用程序
  • 如何获取可编辑JComboBox中已写入的值?

    我继续搜索 似乎每个人都只使用JComboBox getSelectedItem 但我的组合框是editable用户可以输入anything The getSelectedItem方法返回组合框中的实际项目之一 而不是在字段中输入的字符串
  • 任务计划程序找不到文件

    我在 Windows Server 2008 R2 Standard 上有大约 20 个计划任务 他们已经工作了几周 但突然这个周末他们都停止了 这些任务都是 bat 文件和 exe 文件 通过单击资源管理器或从 cmd 运行 每个文件都可
  • 使用 DataContractJsonSerializer 将字典序列化为 JSON 对象

    我有一个 DataContract 具有一些属性并使用以下命令序列化为 JSON 的对象DataContractJsonSerializer 其中一个属性是类型Dictionary
  • 是否可以根据完整模板参数构造成员数组的元素?

    Assume template
  • 运算符=的返回类型 - 引用还是值?

    从函数 operator 返回有什么区别 by reference by value 在下面的示例中 两个版本似乎都产生了正确的结果 include
  • jSeparator 外观 - 预览设计与运行文件 (netbeans)

    我有这个小问题 我正在使用 Netbeans 当我单击 预览设计 时 我看到的 jSeparators 如下所示 但是当我运行该项目时 它是这样的 我该如何解决这个问题 我希望该项目看起来像预览设计 Thanks 当您运行窗口时 JFram
  • WPF 列表框项目不自动换行

    My ListBox其中有一个可能很长的描述字段 我不想使用水平滚动条 而是想自动换行 如果我设置它就有效MaxWidth但自从ListBox更改大小我不想对值进行硬编码 最好的方法是什么 编辑 描述位于TextBlock 简化的XAML
  • xml删除php中的子节点

    我试图通过 id 属性删除 druzenje 元素 我知道要做到这一点 我必须从该元素中删除所有子节点
  • 输出到精确的流浮点数

    我的浮点数精度有问题 int main void double b 106 829599 float a b std cerr lt lt std setprecision 6 lt lt a lt lt a lt lt b lt lt b
  • phonegap运行android报错

    每当我尝试使用构建项目时phonegap run 我收到以下错误 C Users MS AwaN my app gt phonegap run android phonegap detecting Android SDK environme
  • 学习 WCF RIA 服务的最佳资源

    您正在查看哪些书籍 视频 文章来了解如何使用新发布的 Silverlight WCF RIA 服务 1 起点是http www silverlight net getstarted riaservices http www silverli
  • nginx:将 ssl 连接转发到另一台服务器

    我有一个 nginx 主服务器 决定将请求路由到的传入服务器名称 对于两个辅助服务器 此主 nginx 服务器还保存 ssl 证书和密钥 第三台服务器拥有自己的证书和密钥 因为这些证书和密钥的更新过程很频繁 我现在的问题是如何配置主 ngi
  • 设置 svnperms 预提交挂钩

    我正在尝试将 svnperms 实现到存储库中 但在一些事情上遇到了困难 pre commit具有执行权限 rwxrwxr x 1 svnadm svn 3018 May 27 10 11 pre commit 这是我在预提交中对 svnp
  • BBP 算法所需的工作精度?

    我希望在低内存环境中计算 Pi 的第 n 位数字 由于我没有可用的小数 这Python 中的纯整数 BBP 算法 http en literateprograms org Pi with the BBP formula 28Python 2