我正在使用长卷公式计算pi。我正在尝试更熟悉浮点数等。我有一个使用双打的工作程序。我的代码的问题是:
我的问题是什么是最准确的变量类型?我怎样才能改变代码以提高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;
}
答案 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]
答案 1 :(得分:1)
具有最高精度的预定义浮点类型为long double
。
有三种预定义的浮点类型:
float
至少有6位精度的十进制数字double
至少有10个,至少和float
long double
至少有10个,至少和double
这些是最低要求;任何或所有这些类型都可以有更高的精度。
如果您需要比long double
更精确的精度,您可以查看GMP,它支持任意精度(在速度和内存使用方面花费相当大的代价)。
答案 2 :(得分:-3)
或者,你可以硬编码PI的数字,看看会发生什么。 ^ _ ^