C++ 使用长双精度还是仅使用双精度计算pi?

C++ 使用长双精度还是仅使用双精度计算pi?,c++,math,loops,floating-point,pi,C++,Math,Loops,Floating Point,Pi,我用一个冗长的公式计算π。我正在尝试更熟悉浮点数等。我有一个使用双精度的工作程序。我的代码的问题是: 如果我使用双精度,pi只精确到小数点后第7位。我不能再准确了 如果我使用长双精度,pi精确到小数点后第9位,但是代码运行时间要长得多。如果我使用长双精度检验精度是否小于0.00000001,pi将返回值9.4246775。我认为这是由于长双 我的问题是什么是最精确的变量类型?如何更改代码以提高pi的精度 这是我的密码: #include <iomanip> #include <

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

  • 如果我使用双精度,pi只精确到小数点后第7位。我不能再准确了
  • 如果我使用长双精度,pi精确到小数点后第9位,但是代码运行时间要长得多。如果我使用长双精度检验精度是否小于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;
    int main()
    {
    双弧;
    双pi;
    双精度;
    双倍上一次=0;
    int y=3;
    int loopcount=0;
    
    cout您可以从std::numeric\u 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";
    }
    
    因此,我预计长双精度将精确到18位。
    该术语的定义如下:

    标准报价:
    18.3.2数字限制[限制]

    另请注意:由于注释位于上述列表的下方:


    Pr> Salnod是错误的(虽然他有两个愚蠢的人在他的C++上不加检查地投票)他的说法只适用于C.C++,因为C++PUE()是一个模板函数。

    或者,您可以对PI的数字进行硬编码,看看会发生什么^_^


    精度最高的预定义浮点类型是
    长双精度

    有三种预定义的浮点类型:

    • float
      至少有6位小数精度
    • double
      至少有10个,并且至少与
      float
    • long double
      至少有10个,并且至少有
      double
    这些是最低要求;这些类型中的任何一种或所有类型都可能具有更高的精度


    如果您需要比
    long double
    提供的精度更高的精度,您可以查看,它支持任意精度(在速度和内存使用方面付出了相当大的代价)

    如果您想对精度进行严格控制,则应考虑切换到定点表示。当您更改为<代码> long double < /代码>时,是否将所有API调用(例如,代码> PUE)(<代码> > <代码> POWER()>代码>、<代码> ARCTANE()> <代码> > <代码> ATANLL()-等效,等等?重命名变量不会有任何区别,但您必须根据变量类型使用正确的方法(API)。这就是sarnold所说的。为什么要将其设置为“10位或更多小数位?”你现在得到9位数,你只需要一个数字,这似乎是个可疑的问题。为什么不硬编码这个常数?@萨诺:不是真的。这是C代码。C++代码的所有类型都有过载版本(因为它可以和C不能)。你只需要确保你使用C++头:这是一个很好的回答。谢谢你。我看不到任何关于这些限制的内容。我已经做了很多阅读。谢谢你的清晰答案。尽管你问了一个很快的问题。如果一个长的双精度是18个地方,为什么我在改变了我的水平之后得到了9.454665的值?精确到您计算机上的值。这些值不是通用的。注意,它不精确到18位。它精确到18位(包括3位)。小数点以上的数字越大,小数点以下的数字越少。从1999年的标准开始,C还有
    pow()的类型通用版本
    中的其他函数。自2011年标准起,
    \u Generic
    允许用户编写类似的函数。
         Double::digits10:  15
    Long Double::digits10:  18