C++ 使用长双精度还是仅使用双精度计算pi?
我用一个冗长的公式计算π。我正在尝试更熟悉浮点数等。我有一个使用双精度的工作程序。我的代码的问题是:C++ 使用长双精度还是仅使用双精度计算pi?,c++,math,loops,floating-point,pi,C++,Math,Loops,Floating Point,Pi,我用一个冗长的公式计算π。我正在尝试更熟悉浮点数等。我有一个使用双精度的工作程序。我的代码的问题是: 如果我使用双精度,pi只精确到小数点后第7位。我不能再准确了 如果我使用长双精度,pi精确到小数点后第9位,但是代码运行时间要长得多。如果我使用长双精度检验精度是否小于0.00000001,pi将返回值9.4246775。我认为这是由于长双 我的问题是什么是最精确的变量类型?如何更改代码以提高pi的精度 这是我的密码: #include <iomanip> #include <
#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;
int main()
{
双弧;
双pi;
双精度;
双倍上一次=0;
int y=3;
int loopcount=0;
cout您可以从std::numeric\u 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";
}
因此,我预计长双精度将精确到18位。
该术语的定义如下:
标准报价:18.3.2数字限制[限制]
另请注意:由于注释位于上述列表的下方:
Pr> Salnod是错误的(虽然他有两个愚蠢的人在他的C++上不加检查地投票)他的说法只适用于C.C++,因为C++PUE()是一个模板函数。
或者,您可以对PI的数字进行硬编码,看看会发生什么^_^
精度最高的预定义浮点类型是
长双精度
有三种预定义的浮点类型:
至少有6位小数精度float
至少有10个,并且至少与double
float
至少有10个,并且至少有long double
double
如果您需要比
long double
提供的精度更高的精度,您可以查看,它支持任意精度(在速度和内存使用方面付出了相当大的代价)如果您想对精度进行严格控制,则应考虑切换到定点表示。当您更改为<代码> long double < /代码>时,是否将所有API调用(例如,代码> PUE)(<代码> > <代码> POWER()>代码>、<代码> ARCTANE()> <代码> > <代码> ATANLL()-等效,等等?重命名变量不会有任何区别,但您必须根据变量类型使用正确的方法(API)。这就是sarnold所说的。为什么要将其设置为“10位或更多小数位?”你现在得到9位数,你只需要一个数字,这似乎是个可疑的问题。为什么不硬编码这个常数?@萨诺:不是真的。这是C代码。C++代码的所有类型都有过载版本(因为它可以和C不能)。你只需要确保你使用C++头:这是一个很好的回答。谢谢你。我看不到任何关于这些限制的内容。我已经做了很多阅读。谢谢你的清晰答案。尽管你问了一个很快的问题。如果一个长的双精度是18个地方,为什么我在改变了我的水平之后得到了9.454665的值?精确到您计算机上的值。这些值不是通用的。注意,它不精确到18位。它精确到18位(包括3位)。小数点以上的数字越大,小数点以下的数字越少。从1999年的标准开始,C还有pow()的类型通用版本
和
中的其他函数。自2011年标准起,\u Generic
允许用户编写类似的函数。
Double::digits10: 15
Long Double::digits10: 18