我正在使用冗长的公式计算 pi。我试图更熟悉浮点数等。我有一个使用双精度数的工作程序。我的代码的问题是:
- 如果我使用双精度数,则 pi 只能精确到小数点后第七位。我无法得到更准确的信息。
- 如果我使用 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;
}
您可以从 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/ 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/ http://www.cplusplus.com/reference/clibrary/cmath/pow/在标准中26.4.7 complex value operations [complex.value.ops]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)