使用 long double 或仅使用 double 来计算 pi?

2024-03-02

我正在使用冗长的公式计算 pi。我试图更熟悉浮点数等。我有一个使用双精度数的工作程序。我的代码的问题是:

  1. 如果我使用双精度数,则 pi 只能精确到小数点后第七位。我无法得到更准确的信息。
  2. 如果我使用 long double,则 pi 精确到小数点后第 9 位,但是代码的运行时间要长得多。如果我使用 long double 检查精度是否小于 0.00000001,则 pi 返回值 9.4246775。我认为这是由于长双倍造成的。

我的问题是最准确的变量类型是什么?如何更改代码以提高 pi 的精度?

这是我的代码:

#include <iomanip>
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
 double arctan;
 double pi;
 double precision;
 double previous=0;
 int y=3;
 int loopcount=0;

   cout<<"Start\n";

   arctan=1-(pow(1,y)/y);

 do
   {
     y=y+2;
     arctan=arctan+(pow(1,y)/y);
     y=y+2;
     arctan=arctan-(pow(1,y)/y);

      pi=4*(arctan);

    //  cout<<"Pi is: ";
    //  cout<<setprecision(12)<<pi<<endl;

      precision=(pi*(pow(10,10)/10));

      loopcount++;

      if(precision-previous<0.000000001)
        break;

      previous=precision;
    }
  while(true);

  cout<<"Pi is:"<<endl;
       cout<<setprecision(11)<<pi<<endl;
  cout<<"Times looped:"<<endl;
       cout<<loopcount<<endl;

return 0;
}

您可以从 std::numeric_limits 获取双精度/长双精度的最大限制

#include <iostream>
#include <limits>

int main()
{
    std::cout << "     Double::digits10:  " << std::numeric_limits<double>::digits10 << "\n";
    std::cout << "Long Double::digits10:  " << std::numeric_limits<long double>::digits10 << "\n";
}

在我的机器上这给出:

     Double::digits10:  15
Long Double::digits10:  18

所以我期望 long double 能够精确到 18 位数字。
该术语的定义可以在这里找到:

http://www.cplusplus.com/reference/std/limits/numeric_limits/ http://www.cplusplus.com/reference/std/limits/numeric_limits/

标准报价:18.3.2 Numeric limits [limits]

另请注意:由于评论位于上面列表的下方:

@sarnold 在他对 pow() 的断言中是不正确的(尽管奇怪的是,他有两个愚蠢的人在没有检查的情况下对他的评论进行了投票)。他所说的仅适用于 C。C++ 具有类型重载,因为在 C++ 中 pow() 是一个模板函数。看:http://www.cplusplus.com/reference/clibrary/cmath/pow/ http://www.cplusplus.com/reference/clibrary/cmath/pow/在标准中26.4.7 complex value operations [complex.value.ops]

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

使用 long double 或仅使用 double 来计算 pi? 的相关文章

随机推荐

  • 尝试使用 AVFoundation AVAssetWriter 将 Metal 框架写入 Quicktime 文件时出现全黑帧

    我正在使用这个 Swift 类 最初显示在这个问题的答案中 实时捕捉 Metal MTKView 作为电影 https stackoverflow com questions 43838089 capture metal mtkview a
  • lambda 捕获是否支持可变参数模板参数

    如果我能做到以下几点那就太好了 template
  • 使用 CATransition 的过渡 CIFilter

    我正在尝试使用CATransition s filter属性与新的 iOS 6 过渡动画 CIBarsSwipeTransition CICopyMachineTransition 等 这CIFilter文档 http developer
  • 如何使表格单元格的内容垂直溢出而不扩大表格单元格的高度?

    我有一个表格单元格div里面 我想要div溢出到表格单元格之外 我怎样才能做到这一点 需要明确的是 我不希望表格单元格随着div 下面的代码是我尝试过的 但它不起作用 HTML table tr class row td class cel
  • 如何在 F# 中使用 WPF 菜单和对话框?

    我一直在尝试寻找使用 XAML 和 F 无需 C 来设置传统菜单和对话框的示例 我在网上能找到的所有内容要么使用 C 要么在最新版本的 F 和 NET 之前就很旧了 谁能建议一个我可以看的例子 谢谢 当您尝试学习 WPF 时 您会遇到许多基
  • 从 C# 中的参数属性访问对象值

    这是我的方法 public Component SaveComponent ValidateMetaFields Component componentToSave 这是我的自定义属性 AttributeUsage AttributeTar
  • 如何从 gRPC 客户端获取状态代码 OK 响应

    当 python 响应成功时 我尝试从 gRPC 中的客户端获取状态代码 与 REST API 类似response status code 200 我需要断言这是一次成功的通话 我尝试通过这样做来解压响应 这是代码结构 不是实际的结构 r
  • Oracle中如何通过SQL获取表注释?

    我试过了 select from user tab comments 它返回 3 列 TABLE NAME TABLE TYPE 和 COMMENTS 但 TABLE NAME 列就像 加密 我需要明确的表名称 TABLE NAME TAB
  • Angular-cli 8 - 是否可以仅在 es2015 上构建?

    在 angular cli 版本 8 中 构建完成了 2 次 一个在 es5 中 一个在 es2015 中 是否可以只在es2015上构建 将目标更改为es5 仅在es5中完成 但我还没有找到仅在es2015中执行此操作的方法 如果您更新您
  • Android 中 onDestroy() 的使用

    如果Java提供了垃圾收集 那么Activity生命周期中还需要onDestroy 吗 onDestroy 您的 Activity 被销毁之前收到的最后一个调用 发生这种情况的原因可能是活动即将完成 有人对其调用 finish 也可能是因为
  • Tensorflow Bow 编码器说明

    有人可以向我解释一下 Tensorflow BoW 编码器正在做什么 返回什么吗 我希望获得每个文档的字数向量 就像在 sklearn 中一样 但是 显然它正在做一些更奇特的事情 在这个例子中 https github com tensor
  • MongoDB Scala - 查询文档中的特定字段值

    所以我知道在 Mongo Shell 中 您可以使用点表示法来获取任何文档中所需的字段 MongoDB Scala 中的点表示法是如何实现的 我对它是如何工作的感到困惑 以下是从集合中获取文档的代码 val record collectio
  • Chrome 扩展本机消息同步

    我在 Windows 上的本机消息同步有问题 我正在尝试同步backgroundPage 和hostApp 之间的消息 通常 我们使用这样的原生消息传递 popup js function appendMessage text docume
  • 由于 SYS_OP_C2C 内部转换,Oracle SQL 执行计划发生变化

    我想知道为什么这个查询的成本 select from address a left join name n on n adress id a id where a street 01 高于 select from address a lef
  • LongListSelector:项目点击?

    我在 Windows Phone 8 上使用 LongListSelector 控件 但无法找出处理项目点击的最佳方法 我发现的几个示例依赖于 SelectionChanged 事件 但是 这个解决方案有问题 因为如果我点击一个打开新页面的
  • 使用 cx_freeze 和 pandas 在 dateutil/zoneinfo 上出现错误 3

    当我尝试使用 cx freeze 编译 hello py 文件时 pandas 0 15 2 出现以下错误 但 0 15 1 没有错误 有人知道如何纠正它吗 我已使用 include files 函数包含 dateutil zoneinfo
  • SVN 是否允许 svn auth 文件规则的路径中存在空白?

    目前 我们遇到了包含空白且属于 svn auth 文件中的规则一部分的目录的问题 因此 我们希望拥有基于路径的授权 并拥有一个包含以下内容的文件 rw junk of me me rw 当我清除身份验证数据并签出存储库的根目录时me 我看到
  • 使用 PHPUnit 测试数组是否包含值

    我创建了这个对象数组 ad 1 new AdUnit array id gt 1 name gt Ad 1 description gt great ad code gt alpha widget id gt 123 ad 2 new Ad
  • 如何计算 Neo4j 中的排名

    我有两种类型的节点 游戏玩家 和一种关系 已玩 PLAYED关系就是拥有一个属性 点 样本数据 玩家 309274 获得10分玩家 309275 获得20分玩家 309276 获得30分玩家 309277 获得40分玩家 309278 获得
  • 使用 long double 或仅使用 double 来计算 pi?

    我正在使用冗长的公式计算 pi 我试图更熟悉浮点数等 我有一个使用双精度数的工作程序 我的代码的问题是 如果我使用双精度数 则 pi 只能精确到小数点后第七位 我无法得到更准确的信息 如果我使用 long double 则 pi 精确到小数