本文介绍了一种使用C++语言实现的高精度π值计算方法。通过选取收敛速度快的公式,并结合对数累加来确定计算所需项数,实现了π值的高精度计算。文章详细介绍了计算过程中的关键步骤,包括模拟乘除运算、确定输入项数等。 摘要由CSDN通过智能技术生成

使用c++计算高精度的π的值,其实就是一个数学的方法向c++语言转化的过程,下面将会展示:

(1)选择计算公式:选取收敛速度快的且容易朝着的计算公式是首要的一环。我们选用:
π/2=1+1/3+1/3*2/5+1/3*2/5*3/7……+1*2*3*……n/3*5*……*(2n+1)
=1+1/3(1+2/5(1+……+(n-1)/(2n-1)(1+n/(2n+1))……);
(2)确定输入的项数。要依据输入的计算位数x确定所要加的项数n,若n 太小,不能保证计算所需的精度。
若n太大,会导致作过多的无效的计算。
可以证明:式中分时第n项之后的所有余项之和Rn<an因此,只要选取n,就满足an<1/10^(x+1)即可,只要使得
lg3+lg5/2+……+lg(2n+1)/n>x+1.于是可设置对数累加实现计算到x位所需的项数n,为确保准确,算法可设置
计算位数超过x位(如5位)只打印出x位。
(3)模拟乘除综合运算。设置a数组,下标根据计算位数预设5000,必要时可增加,计算的整数值存放在a(0)中。
小数点后第i位存放在a(i)中。
数组除以2n+1,乘以n,加上1,在除以2n-1,乘n-1,加上1;……。这些数组操作设置在j(j=n,n-1,…,1)循环
中实施。按照公式实施除法操作:被除数为c,除数为d分别取2n+1,2n-1,…,3.商仍然存放在个数组元素(a(i)=c/d)
中,余数(c/d)乘10后加在后面一元素a(i+1)上,作为后一位的被除数。
按公式实施乘法操作:乘数j分别取n,n-1,……,1,乘积要注意进位,设进位数位d,则对计算的积a(i)=a(i)*j+d,
取其十位以上数作为进位数b=a(i)/10,取其个位数仍存放在原数组元素a(i)=a(i)%10中。
循环实施乘除操作完成后,按数组元素从高位到低位顺序输出,因计算位数较多,为方便查对,每一行控制打印50位,每10
个位空一格。

因为在计算中使用了数组,而且是需要开辟大片的空间进行存储,所以呢,可能会由些缓慢,但是不必着急,也是会很快的。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
float s;
int b,x,n,c,i,j,d,l,a[5000];
cout<<"欢迎您的验证,现在我们开始验证π的高精度的计算。"<<endl;
cout<<endl<<"请输入精确位数:";
cin>>x;
for(s=0,n=1;n<=5000;n++)//累加确定项数.
{
s=s+log10((2*n+1)/n);
if(s>x+1)
break;
}
for(i=0;i<=x+5;i++)
a[i]=0;
for(c=1,j=n;j>=1;j--)//按公式分布计算。
{
d=2*j+1;
for(i=0;i<=x+4;i++)//各位实施除2j+1.
{
a[i]=c/d;
c=(c%d)*10+a[i+1];
}
a[x+5]=c/d;
for(b=0,i=x+5;i>=0;i--)//各位实施乘j
{
a[i]=a[i]*j+b;
b=a[i]/10;
a[i]=a[i]%10;
}
a[0]=a[0]+1;
c=a[0];//整数加1.
}
for(b=0,i=x+5;i>=0;i--)//按公式各位乘2
{
a[i]=a[i]*2+b;
b=a[i]/10;
a[i]=a[i]%10;
}
cout<<endl<<"PI="<<a[0]<<".";//诸位输出计算结果。
for(l=10,i=1;i<=x;i++)
{
cout<<a[i];
l++;
if(l%10==0)
cout<<"   ";
if(l%50==0)
cout<<endl;
}
cout<<endl;
return 0;
}

2011.9.6    15:13

某次碰到pi,想用编程打印出它的比较多的有效 (至少比背的要多)。 开始考虑到 pi/4 = arctan(1) arctan(x)展成多项式 arctan(x) = (1/1!)x - (1/3)(x^3) + (1/5)(x^5) - .... 所以有 pi/4 = 1 - 1/3 + 1/5 - 1/7 + ..... 但是上式后面的式子收敛太慢了,编程很难 到很多的有效
下面是一个使用 C 语言 π 的前一亿 算法 : 使用 Bailey–Borwein–Plouffe(BBP)公式 π 数。BBP公式是一种用于快速 计算 π 的小数点后第n 的公式,其中n是正整数。 使用数据类型 存储 大数,如long long int或__int128。这样可以 存储 更多 数。 使用循环,从0开始,每次循环一次就 取一 ,直到 取到第一亿 为止。 在每次循环中,使用BBP公式...
😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪 文章目录📔前言📕1.公式选择📗2.实现难点解析📘3.代码实现📙后记 π 一直是一个备受数学界青睐的数字。从古至今,无数的学者都在努力探 π 精确
#include &lt;bits/std c++ .h&gt; using namespace std; long a=10000,b,c=56000,d,e,f[56001],g; int main(){ for(;b-c ; )f[b++]=a/5; for(;d=0,g=c*2...
用下面的公式 Π的近似 Π4\frac{Π}{4}4Π​=1-13\frac{1}{3}31​+15\frac{1}{5}51​-17\frac{1}{7}71​+…… 直到最后一项的绝对 小于10−710^{-7}10−7 #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main() int s = 1; double n