首页 文章

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

提问于
浏览
2

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

  • 如果我使用double,pi只能精确到小数点后第7位 . 我不能让它变得更准确 .

  • 如果我使用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;
}

3 回答

  • 3

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

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

    • float 具有至少6位精度的十进制数字

    • double 至少有10个,至少和 float 一样多

    • long double 至少有10个,至少和 double 一样多

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

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

  • -3

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

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

  • 1

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

相关问题