33,311
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cmath>
using namespace std;
float count(int max);
int main()
{
int i = 0;
float pi = 1., pi1 = 2.;
while(fabs(pi1-pi)>1.0e-5)
{
i++;
pi = count(i);
pi1 = count(i + 1);
}
cout << "n = " << i << endl;
return 0;
}
float count(int max)
{
float sum = 2.0;
for (int i = 1; i <= max; i++)
{
sum *= 4 * i * i / ((2 * i - 1)*(2 * i + 1));
}
return sum;
}
//如果要很高很高的精度,可以通过计算,以字符串来保存。
//bit为精确到小数点后的位数,datas为需要输出到的字符串的指针(datas至少要有bit+3个元素)
//最后几位可能是错的(如需准确的前n位数,可以带入n+15位去运算,最后的字符串截取至n位)。
void mult(int *a,int b,int *s,int bit);
void divi(int *a,int b,int *s,int bit);
void incr(int *a,int *b,int *s,int bit);
bool eqs(int *a,int *b,int bit);
void get_pi(int bit,char* datas)
{
int *pi=new int[bit+1];
int *ls=new int[bit+1];
int *sl=new int[bit+1];
int *p=new int[bit+1];
for(int i=0;i<=bit;i++)
*(pi+i)=*(ls+i)=*(sl+i)=*(p+i)=0;
memset(pi,0,sizeof(pi));
memset(ls,0,sizeof(ls));
memset(sl,0,sizeof(sl));
memset(p,0,sizeof(p));
*pi=*ls=*sl=1;
for(int is=1;;is++)
{
mult(ls,is,sl,bit);
divi(sl,2*is+1,ls,bit);
incr(pi,ls,p,bit);
if(eqs(pi,p,bit))
break;
int *t;
t=p;
p=pi;
pi=t;
}
mult(p,2,pi,bit);
datas[0]=*pi+'0';
datas[1]='.';
for(int in=1;in<=bit;in++)
datas[in+1]=*(pi+in)+'0';
datas[bit+2]='\0';
delete[] pi;
delete[] ls;
delete[] sl;
delete[] p;
}
//以下4个函数是get_pi函数内调用的函数
void mult(int *a,int b,int *s,int bit)
{
for(int i=bit,c=0;i>=0;i--)
{
int y=(*(a+i))*b+c;
c=y/10;
*(s+i)=y%10;
}
}
void divi(int *a,int b,int *s,int bit)
{
for(int i=0,c=0;i<=bit;i++)
{
int y=(*(a+i))+c*10;
c=y%b;
*(s+i)=y/b;
}
}
void incr(int *a,int *b,int *s,int bit)
{
for(int i=bit,c=0;i>=0;i--)
{
int y=(*(a+i))+(*(b+i))+c;
c=y/10;
*(s+i)=y%10;
}
}
bool eqs(int *a,int *b,int bit)
{
int i=0;
while(((*(a+i))==(*(b+i)))&&(i<=bit))
i++;
return i>bit;
}
# include <stdio.h>
int main()
{
double old_pi = 0.0;
double pi = 2.0;
int i = 1;
while (pi - old_pi > 10e-9)
{
old_pi = pi;
pi = pi * 4.0 * i * i / ((2.0 * i - 1) * (2.0 * i + 1));
i++;
}
printf("%i %f %f\n", i - 1, pi, old_pi);
return 0;
}
int i = 0;
cout << "n = " << i << endl;
整数!!!
#include <stdio.h>
long a=10000;
long b;
long c=2800;
long d;
long e;
long f[2801];
long g;
int main() {
for(;b-c;) f[b++]=a/5;
// while (1) {
// if (0==b-c) break;
// f[b]=a/5;
// b++;
// }
//f[0 - 2800] = 10000/5
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
// while (1) {
// d=0;
// g=c*2;
// if (0==g) break;
// b=c;
// while (1) {
// d+=f[b]*a;
// f[b]=d%--g;
// d/=g--;
// --b;
// if (0==b) break;
// d*=b;
// }
// c-=14;
// printf("%.4d",e+d/a);
// e=d%a;
// }
return 0;
}
sum *= 4 * i * i / ((2 * i - 1)*(2 * i + 1));
上面代码在计算4 * i * i / ((2 * i - 1)*(2 * i + 1))这部分时是采用整数运算的,导致精度丢失
改成这样sum *= 4 .0* i * i / ((2 * i - 1)*(2 * i + 1));
或者这样sum =sum* 4 * i * i / ((2 * i - 1)*(2 * i + 1));
都可以
int a = 3, b = 4;
double c = a / b; // c=0
sum *= 4.0 * i * i / ((2.0 * i - 1.0)*(2.0 * i + 1.0));
原本
sum *= 4 * i * i / ((2 * i - 1)*(2 * i + 1));
中的i是整数,所有右侧默认按照整数运算,即小数会被舍去。将数字强行加上.0后,则会按照浮点数进行运算,就正确了