2

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

  1. 如果我使用双精度数,pi 只能精确到小数点后 7 位。我不能让它更准确。
  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;
}
4

3 回答 3

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

所以我希望 long double 可以精确到 18 位。
这个术语的定义可以在这里找到:

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/中的标准26.4.7 complex value operations [complex.value.ops]

于 2012-03-21T00:15:42.913 回答
1

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

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

  • float至少有 6 位小数精度
  • double至少有 10 个,并且至少有float
  • long double至少有 10 个,并且至少有double

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

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

于 2012-03-21T00:47:29.707 回答
-3

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

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

于 2012-03-21T00:23:44.713 回答