使用长双或只是双倍来计算pi?

时间:2012-03-20 22:18:15

标签: c++ math loops floating-point pi

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

  1. 如果我使用双精度数,pi只能精确到小数点后第7位。我无法让它变得更准确。
  2. 如果我使用long double,则pi精确到小数点后第9位,但代码运行时间要长得多。如果我使用long double检查精度小于0.00000001,则pi返回值9.4246775。我认为这是由于长双。
  3. 我的问题是什么是最准确的变量类型?我怎样才能改变代码以提高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;
    }
    

3 个答案:

答案 0 :(得分:3)

你可以从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

所以我希望长双精确到18位数 这个术语的定义可以在这里找到:

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

标准报价:18.3.2 Numeric limits [limits]

另请注意:由于评论在上面的列表中显示:

@sarnold在他对pow()的断言中是不正确的(虽然神秘地他有两个愚蠢的人在没有检查的情况下投票他的评论)。他所说的只适用于C. C ++有类型的重载,因为在C ++中,pow()是一个模板函数。请参阅26.4.7 complex value operations [complex.value.ops]

标准中的http://www.cplusplus.com/reference/clibrary/cmath/pow/

答案 1 :(得分:1)

具有最高精度的预定义浮点类型为long double

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

  • float至少有6位精度的十进制数字
  • double至少有10个,至少和float
  • 一样多
  • long double至少有10个,至少和double
  • 一样多

这些是最低要求;任何或所有这些类型都可以有更高的精度。

如果您需要比long double更精确的精度,您可以查看GMP,它支持任意精度(在速度和内存使用方面花费相当大的代价)。

答案 2 :(得分:-3)

或者,你可以硬编码PI的数字,看看会发生什么。 ^ _ ^

http://www.joyofpi.com/pi.html