C语言计算圆周率小数后10位,计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者...

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

只需要 30 多句代码!

(浏览

168959

次)

大家都知道 π=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 = String().sprintf(_T("Pi=%.13f"), x);

}

点击 Button1 按钮,在 Memo1 显示出执行结果:

Pi=3.1415926535898

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

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

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

计算 π 值,精确到小数点后 1000 位

void __fastcall TForm1::Button2Click(TObject *Sender)

{

const int 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[i]*a + d;

z[i] = c % 10;

d = c / 10;

}

//z/=b;

d = 0;

for(int i=0; i

{

c = z[i]+d*10;

z[i] = c / b;

d = c % b;

}

//x+=z;

Run = 0;

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

{

c = x[i] + z[i];

x[i] = c%10;

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

Run |= z[i];

}

a++;

b+=2;

}

String s;

s.cat_sprintf(_T("计算了 %d 次\r\n"), Cnt);

s.cat_sprintf(_T("Pi=%d%d.\r\n"), x[0], x[1]);

for(int i=0; i

{

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

s += _T("\r\n");

s += (int)x[i+2];

}

Memo1->Text = s;

}

点击按钮 Button2 执行结果 (圆周率 1000 位):

计算了 3343 次

Pi=03.

1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196

4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273

7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094

3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912

9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132

0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235

4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859

5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303

5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989

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

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

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

执行结果精度可达 10000 位。

由于计算 10000 位 π 值的时间比较长,可能需要几秒到十几秒的时间,需要有耐心等待。

在程序里面加上运算计时,还可以通过这个计算 π 值的小程序来评估处理器的运算速度,

通过测试发现,同样的代码,编译为 32 位和 64 位 exe 文件,在同一台电脑里面运行 32 位和 64 位的程序,

64 位的计算速度要比 32 位的快很多 (【注】找到原因了,是由于编译器的问题,32 位默认使用的是 Borland 编译器,运行速度慢,如果 32 位选择了 clang 编译器,速度就正常了)。

下面是改完的程序:

计算 π 值,精确到小数点后 10000 位,增加运算计时

void __fastcall TForm1::Button3Click(TObject *Sender)

{

TDateTime t0 = Now();

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

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[i]*a + d;

z[i] = c % 10;

d = c / 10;

}

//z/=b;

d = 0;

for(int i=0; i

{

c = z[i]+d*10;

z[i] = c / b;

d = c % b;

}

//x+=z;

Run = 0;

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

{

c = x[i] + z[i];

x[i] = c%10;

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

Run |= z[i];

}

a++;

b+=2;

}

double t = 86400.0*(double)(Now()-t0); // 计算经历的时间(秒)

String s;

s.cat_sprintf(_T("计算次数:%d 次\r\n"), Cnt);

s.cat_sprintf(_T("计算时间:%.3f 秒\r\n"), t);

s.cat_sprintf(_T("Pi=%d%d.\r\n"), x[0], x[1]);

for(int i=0; i

{

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

s += _T("\r\n");

s += (int)x[i+2];

}

Memo1->Text = s;

}

点击按钮 Button3 计算结果 (圆周率 10000 位):

计算次数:33538 次

计算时间:8.656 秒

Pi=03.

1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196

4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273

7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094

3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912

9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132

0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235

4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859

5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303

5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989

3809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151

5574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012

8583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912

9331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279

6782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955

3211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000

8164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333

4547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383

8279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863

0674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009

9465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203

4962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382

6868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388

4390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506

0168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125

1507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858

9009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364

5428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344

0374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927

8191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961

5679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215

0306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856

1005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007

2305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116

7229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412

6711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535

8932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923

2332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656

1809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658

2131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396

6655730925471105578537634668206531098965269186205647693125705863566201855810072936065987648611791045

3348850346113657686753249441668039626579787718556084552965412665408530614344431858676975145661406800

7002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830

6343285878569830523580893306575740679545716377525420211495576158140025012622859413021647155097925923

0990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901

9389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571

8530614228813758504306332175182979866223717215916077166925474873898665494945011465406284336639379003

9769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296

6171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513

6222247715891504953098444893330963408780769325993978054193414473774418426312986080998886874132604721

5695162396586457302163159819319516735381297416772947867242292465436680098067692823828068996400482435

4037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617

5578297352334460428151262720373431465319777741603199066554187639792933441952154134189948544473456738

3162499341913181480927777103863877343177207545654532207770921201905166096280490926360197598828161332

3166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267

9456127531813407833033625423278394497538243720583531147711992606381334677687969597030983391307710987

0408591337464144282277263465947047458784778720192771528073176790770715721344473060570073349243693113

8350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415

9562586586557055269049652098580338507224264829397285847831630577775606888764462482468579260395352773

4803048029005876075825104747091643961362676044925627420420832085661190625454337213153595845068772460

2901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455

2540790914513571113694109119393251910760208252026187985318877058429725916778131496990090192116971737

2784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745

1960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510

2283345085048608250393021332197155184306354550076682829493041377655279397517546139539846833936383047

4611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010

2183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501

9567302292191393391856803449039820595510022635353619204199474553859381023439554495977837790237421617

2711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594

0516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867

4460477464915995054973742562690104903778198683593814657412680492564879855614537234786733039046883834

3634655379498641927056387293174872332083760112302991136793862708943879936201629515413371424892830722

0126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605

2772190055614842555187925303435139844253223415762336106425063904975008656271095359194658975141310348

2276930624743536325691607815478181152843667957061108615331504452127473924544945423682886061340841486

3776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862

9164219399490723623464684411739403265918404437805133389452574239950829659122850855582157250310712570

1266830240292952522011872676756220415420516184163484756516999811614101002996078386909291603028840026

9104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157

9598470356222629348600341587229805349896502262917487882027342092222453398562647669149055628425039127

5771028402799806636582548892648802545661017296702664076559042909945681506526530537182941270336931378

5178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291

6161528813843790990423174733639480457593149314052976347574811935670911013775172100803155902485309066

9203767192203322909433467685142214477379393751703443661991040337511173547191855046449026365512816228

8244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968

3408005355984917541738188399944697486762655165827658483588453142775687900290951702835297163445621296

4043523117600665101241200659755851276178583829204197484423608007193045761893234922927965019875187212

7267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522

7429958180724716259166854513331239480494707911915326734302824418604142636395480004480026704962482017

9289647669758318327131425170296923488962766844032326092752496035799646925650493681836090032380929345

9588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885

6909411303150952617937800297412076651479394259029896959469955657612186561967337862362561252163208628

6922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801

2248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417

2543709069793961225714298946715435784687886144458123145935719849225284716050492212424701412147805734

5510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934

1596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848

3084076118301305279320542746286540360367453286510570658748822569815793678976697422057505968344086973

5020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001

2645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678

提高精度的原理:

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

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

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

d15d86c73ef39d9ef2479a2055ac0fae.gif

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值