c++ - 使用 long double 还是仅使用 double 来计算 pi?

标签 c++ math loops floating-point pi

我正在使用冗长的公式计算圆周率。我正在尝试更熟悉 float 等。我有一个使用 double 的工作程序。我的代码的问题是:

  1. 如果我使用 double ,pi 只精确到小数点后第 7 位。我不能让它更准确。
  2. 如果我使用 long double,pi 精确到小数点后第 9 位,但代码的运行时间要长得多。如果我使用 long double 检查小于 0.00000001 的精度,pi 返回值 9.4246775。我认为这是由于 long double。

我的问题是最准确的变量类型是什么?如何更改我的代码以提高 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 获得 double /长 double 的最大限制

#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 数值限制 [limits]

另请注意:由于评论在上面的列表中很靠后:

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

的标准中

关于c++ - 使用 long double 还是仅使用 double 来计算 pi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795877/

相关文章:

c++ - Karatsuba 整数乘法因段错误而失败

c++ - 添加没有长整数的整数

C++嵌套循环性能

c++ - 如何声明一个空的 char* 并动态增加大小?

c++ - 具有重复输入的文件流

算法:计算椭圆内的伪随机点

java - 泊松分布的最大似然估计?

python - 循环字符串难度python 3

C:即使条件仍然满足,循环也会弹出

c++ - python 中等效的 C++ 嵌套打印