/*************************************************************** * Computing pi with BBP formula. **************************************************************/#include <math.h>#include <iostream>#include <stdio.h>#include <stdlib.h>usingnamespacestd;classBbp{// Declarationintd;// Digits to computedoublepi;// Picharpi_hex[14];// Pi(Hex)clock_tt0,t1;// TimedoubleS(int);// Compute SlongcompModExp(int,int,int);// Computer Modular ExponentiationvoidconvHex(double,char[]);// Convert Pi to Hex-stringpublic:Bbp(int);// ConstructorvoidcompPi();// Compute PI};/* * Constructor */Bbp::Bbp(intd){cout<<"**** PI Computation ( digit: "<<d<<" )"<<endl;this->d=d-1;}/* * Compute PI */voidBbp::compPi(){// Time (start)t0=clock();// Compute Pipi=4.0*S(1)-2.0*S(4)-S(5)-S(6);pi=pi-(int)pi+1.0;convHex(pi,pi_hex);printf("FRACTION : %.15f\n",pi);printf("HEX DIGITS: %10.10s\n",pi_hex);// Time (end of computation)t1=clock();cout<<"( TIME: "<<(double)(t1-t0)/CLOCKS_PER_SEC<<" seconds )"<<endl;}/* * Compute S */doubleBbp::S(intj){doubles=0.0;// Summation of Total, Leftdoublet;// Each term of right summationintr;// Denominatorintk;// Loop indexdoubleEPS=1.0e-17;// Loop-exit accuration of the right summation// Left Sum (0 ... d)for(k=0;k<=d;k++){r=8*k+j;t=(double)compModExp(16,d-k,r);t/=r;s+=t-(int)t;s-=(int)s;}// Right sum (d + 1 ...)while(1){r=8*k+j;t=pow(16.0,(double)(d-k));t/=(double)r;if(t<EPS)break;s+=t;s-=(int)s;k++;}returns;}/* * Compute Modular Exponentiation */longBbp::compModExp(intb,inte,intm){longans;if(e==0)return1;ans=compModExp(b,e/2,m);ans=(ans*ans)%m;if((e%2)==1)ans=(ans*b)%m;returnans;}/* * Convert Pi to Hex-strings */voidBbp::convHex(doublex,charchx[]){doubley;inti;constcharhx[]="0123456789ABCDEF";y=fabs(x);for(i=0;i<16;i++){y=16.0*(y-floor(y));chx[i]=hx[(int)(y)];}}intmain(intargc,char**argv){try{// Getting argumentsif(argc==1){cout<<"Please input a digit to compute!"<<endl;returnEXIT_FAILURE;}intd=atoi(argv[1]);// InstantiationBbpobjMain(d);// Compute PIobjMain.compPi();}catch(...){cout<<"ERROR!"<<endl;returnEXIT_FAILURE;}returnEXIT_SUCCESS;}