我正在使用长卷配方来计算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 回答
具有最高精度的预定义浮点类型是
long double
.有三种预定义的浮点类型:
float
具有至少6位精度的十进制数字double
至少有10个,至少和float
一样多long double
至少有10个,至少和double
一样多这些是最低要求;任何或所有这些类型都可以具有更高的精度 .
如果你需要比
long double
更精确的精度,你可以看一下GMP,它支持任意精度(在速度和内存使用方面花费相当大的费用) .或者,您可以硬编码PI的数字,看看会发生什么 . ^ _ ^
http://www.joyofpi.com/pi.html
你可以从std :: numeric_limits获得双打/长双打的最大限制
在我的机器上,这给出:
所以我希望长双精确到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/