c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位

大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。现在有了电脑, 这个问题就简单了。

电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参考《高等数学》,以下是比较有名的有关π的级数:

8813856135e1b76393a88aee144ee84d.gif

其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。

因为计算π值, 而这个公式是计算π/2的, 我们把它变形:

π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + …

对于级数, 我们先做个简单测试, 暂时不要求精度:

用 C++ Builder 新建一个工程, 在 Form 上放一个 Memo1 和 一个 Button1, 在 Button1 的 OnClick 事件写:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double x=2, z=2;

int a=1, b=3;

while(z>1e-15)

{

z = z*a/b;

x += z;

a++;

b+=2;

}

Memo1->Text = AnsiString().sprintf(“Pi=%.13f”, x);

}

按Button1在Memo1显示出执行结果:

Pi=3.1415926535898

这个程序太简单了, 而且 double 的精度很低, 只能计算到小数点后 10 几位。

把上面的程序改造一下, 让它精确到小数点后面 1000 位再测试一下:

在 Form 上再放一个按钮 Button2, 在这个按钮的 OnClick 事件写:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

const ARRSIZE=1010, DISPCNT=1000; //定义数组大小,显示位数

char x[ARRSIZE], z[ARRSIZE]; //x[0] x[1] . x[2] x[3] x[4] …. x[ARRSIZE-1]

int a=1, b=3, c, d, Run=1, Cnt=0;

memset(x,0,ARRSIZE);

memset(z,0,ARRSIZE);

x[1] = 2;

z[1] = 2;

while(Run && (++Cnt<200000000))

{

//z*=a;

d = 0;

for(int i=ARRSIZE-1; i>0; i–)

{

c = z*a + d;

z = c % 10;

d = c / 10;

}

//z/=b;

d = 0;

for(int i=0; i

{

c = z+d*10;

z = c / b;

d = c % b;

}

//x+=z;

Run = 0;

for(int i=ARRSIZE-1; i>0; i–)

{

c = x + z;

x = c%10;

x[i-1] += c/10;

Run |= z;

}

a++;

b+=2;

}

Memo1->Text = AnsiString().sprintf(“计算了 %d 次\r\n”,Cnt);

Memo1->Text = Memo1->Text + AnsiString().sprintf(“Pi=%d%d.\r\n”, x[0],x[1]);

for(int i=0; i

{

if(i && ((i%100)==0))

Memo1->Text = Memo1->Text + “\r\n”;

Memo1->Text = Memo1->Text + (int)x[i+2];

}

}

按 Button2 执行结果:

Pi=03.

141592653589793238462643383279502884197169399375105820974944 5923078164062862089986280348253421170679

821480865132823066470938446095505822317253594081284811174502 8410270193852110555964462294895493038196

442881097566593344612847564823378678316527120190914564856692 3460348610454326648213393607260249141273

724587006606315588174881520920962829254091715364367892590360 0113305305488204665213841469519415116094

330572703657595919530921861173819326117931051185480744623799 6274956735188575272489122793818301194912

983367336244065664308602139494639522473719070217986094370277 0539217176293176752384674818467669405132

000568127145263560827785771342757789609173637178721468440901 2249534301465495853710507922796892589235

420199561121290219608640344181598136297747713099605187072113 4999999837297804995105973173281609631859

502445945534690830264252230825334468503526193118817101000313 7838752886587533208381420617177669147303

598253490428755468731159562863882353787593751957781857780532 1712268066130019278766111959092164201989

这下心理有底了, 是不是改变数组大小就可以计算更多位数呢?答案是肯定的。

如果把定义数组大小和显示位数改为:

const ARRSIZE=10100, DISPCNT=10000; //定义数组大小,显示位数

执行结果精度可达 10000 位:

Pi=03.

141592653589793238462643383279502884197169399375105820974944 5923078164062862089986280348253421170679

821480865132823066470938446095505822317253594081284811174502 8410270193852110555964462294895493038196

442881097566593344612847564823378678316527120190914564856692 3460348610454326648213393607260249141273

724587006606315588174881520920962829254091715364367892590360 0113305305488204665213841469519415116094

330572703657595919530921861173819326117931051185480744623799 6274956735188575272489122793818301194912

983367336244065664308602139494639522473719070217986094370277 0539217176293176752384674818467669405132

000568127145263560827785771342757789609173637178721468440901 2249534301465495853710507922796892589235

420199561121290219608640344181598136297747713099605187072113 4999999837297804995105973173281609631859

502445945534690830264252230825334468503526193118817101000313 7838752886587533208381420617177669147303

598253490428755468731159562863882353787593751957781857780532 1712268066130019278766111959092164201989

380952572010654858632788659361533818279682303019520353018529 6899577362259941389124972177528347913151

… 限于篇幅, 这里就省略了, 还是留给你自己来算吧!

502014102067235850200724522563265134105592401902742162484391 4035998953539459094407046912091409387001

264560016237428802109276457931065792295524988727584610126483 6999892256959688159205600101655256375678

提高精度的原理:

以上程序的原理是利用数组把计算结果保存起来, 其中数组每一项保存10进制数的一位,

小数点定位在数组第1个数和第二个数之间, 即小数点前面2位整数, 其余都是小数位。

利用电脑模拟四则运算的笔算方法来实现高精度的数据计算,没想到最原始的方法竟然是精度最高的。

d15d86c73ef39d9ef2479a2055ac0fae.gif

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值