用BBP公式计算π

//圆周率pi的计算(精确到小数点后1000位)


#include<iostream.h>
#include<math.h>
#include<stdio.h>

double bbp(int n,int k,int l)
{
 int i;
 long b=1;
 double c=1;
 if(n>k)
 {
  for(i=n-k;i!=0;i--)
   b=(b*16+0)%(8*k+l);
  return(((double)b)/((double)(8*k+l)));
 }
 else
  if(n==k)
   return(((double)1)/((double)(8*k+l)));
  else
  {
   for(i=0;i<(k-n);i++)
    c=c/16;
   return(c/(8*k+l));
  }
};

void pi(int m,int n,int p[])
{
 double a=0;
 int k=0;
 while(k<(n+8))
 {
  a+=4+4*bbp(n,k,1)-2*bbp(n,k,4)-bbp(n,k,5)-bbp(n,k,6);
  a=a-(int)a;
  k++;
 }
 for(k=0;k<m;k++)
 {
  a*=16;
  p[k]=(int)a;
  a=a-(int)a;
 }
}
void div(int p[])
{
 int i,j=0;
 for(i=0;i<300;i++)
 {
  p[i]=j*10000+p[i];
  j=p[i]%2;
  p[i]=p[i]/2;
 }
}

void add(int a[],int b[])
{
 int i,j=0;
 for(i=299;i>=0;i--)
 {
  a[i]=a[i]+b[i]+j;
  if(a[i]>=10000)
  {
   a[i]-=10000;
   j=1;
  }
  else
   j=0;
 }
}

void test()
{
 int i,j,p[1100]={0},r[300]={0};
 short q[4000];
 for(i=0;i<125;i++)
  pi(8,i*8,p+i*8);
 for(i=0;i<1000;i++)
 {
  j=p[i];
  q[i*4+3]=j%2;
  j=j/2;
  q[i*4+2]=j%2;
  j=j/2;
  q[i*4+1]=j%2;
  j=j/2;
  q[i*4+0]=j%2;
  p[i]=0;
 }
 p[0]=10000;
 for(i=0;i<4000;i++)
  {
  div(p);
  if(q[i]) add(r,p);
  }
 cout<<3<<".";
 for(i=0;i<250;i++)
 {
  if(r[i]<10)
   cout<<"000";
  else
   if(r[i]<100)
    cout<<"00";
   else
    if(r[i]<1000)
     cout<<"0";
  cout<<r[i];
 }
 cout<<endl;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值