圆周率的计算

写在前面

  前几天在观看B站一位UP主视频时,无意中了解到随机数字‘1729’,这几位数字在圆周率中出现过,为了验证此结论,决定采用编程来计算一下比较准确的圆周率,并打印出来!

直接打印

在python中运用math库中的math.pi进行计算

>>> import math
>>> math.pi
# 输出结果,有精度限制
3.141592653589793

换成整型打印输出

# 计算圆周率
import math
num = 307 #由于精度限制,最高为307
T = pow(10, num)
val = int(math.pi * T)
print(val)

打印结果

314159265358979331784538041443762219083154397857643037429521516216820119599421
905451802799525664114097310343520448061093528119661232909775374033526128016193
735242335688837965294710555163856163144313381864828000418180353080221348339148
84645131986531623916630788964914954076030731869165419827572759855540207616

运用类库直接打印输出精度非常有限,而转化为整型输出,则失去了原本3.1415926.....的直观感受,换种方式再输出试试!

运用公式

公式及代码

高等数学中我们学过泰勒公式,可以运用泰勒展开计算相对精确的圆周率。

由于 tan(π/4)值为1,则其反函数arctan(1)的值为 π/4,因此我们可以对arctan()函数进行泰勒展开得到如下表达式

from decimal import Decimal
from decimal import getcontext

def cal_pi(precision):
    sum = 0
    getcontext().prec=precision
    for i in range(precision):
                sum += pow(-1, i)*(Decimal(1)/(2*i+1))

    return sum*4
    
print(cal_pi(1000)) # 打印前1000位
# 输出结果
3.14059265383979292596359650286939597045138933077972448936745778354190793123974
760826517233200767020723140388527603871089993806662955221456455123774288715005
044051233930253707282585276024662802556200856947170045106582610618474409966780
808081523183358215038208858268038140310915357488441696609748152695470751811941
618454642444628657371209794430943522955046660911388189217289869224099205208957
830246085273767493310595113778204702855276228843410464307654910047553636392801
132921578926049678858100972178427631124808458419977320467322575215068489895855
738375958552622550780773114985100357121933953643319321928085850164371266432959
193644879435966647201864960486064172224170773010740654693646436217847978016709
070312642364536467005010008316833827386805937972296410594390332459582904427016
823221938868372562967885972691488260672864965976362056863209977606920346132356
526033413787703171596999151703153061821515337044106493591303943343550176800670
0003562571354454019577851729026491381185793546112523014568827104

我们发现,打印结果的前几位失去了准确。

误差分析

arctan(1) = π/4

1. 主要原因 由于公式中的n值最终要趋近于无穷大,而1000相对而言太小了,很难得到准确数值

2. 其他因素 我们在利用泰勒公式运算时会有一定的误差,我们计算的结果再乘4,无意间放大了误差。

经测试,对此公式采用C语言进行计算,当n取1亿的时候,计算结果为 3.141593

蒙特卡洛方法计算圆周率

蒙特卡洛方法是利用概率求解的

在一个二维直角坐标系内,划分正方形,假定向这个正方形区域内撒点,自然有的点落在圆内,有的落在圆外,进而利用数学方法,可以计算出相应的圆周率的数值。

# 计算圆周率 蒙特卡洛方法
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
            x,y = random(), random()
            dist = pow(x**2+y**2, 0.5)
            if dist <= 1.0:
                        hits = hits + 1
pi = 4 * (hits/DARTS)
print("pi = {}".format(pi))

输出
pi = 3.141256

误差分析:

撒点的行为是一个随机事件,当然在有限的数据中不可能准确的表述圆周率的数值,所以我们所得值为近似值。

另一种公式算法

  • Bailey–Borwein–Plouffe 公式

from decimal import Decimal
from decimal import getcontext

def cal_pi(precision):
    getcontext().prec=precision
    return sum(1/Decimal(16)**k * (Decimal(4)/(8*k+1) -  Decimal(2)/(8*k+4) -  Decimal(1)/(8*k+5) -  Decimal(1)/(8*k+6)) for k in range (precision))

print(cal_pi(9000)) # 打印前9000位

打印结果如下

3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745530506820349625245174939965143142980919065925093722169646151570985838741059788595977297549893016175392846813826868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388439045124413654976278079771569143599770012961608944169486855584840635342207222582848864815845602850601684273945226746767889525213852254995466672782398645659611635488623057745649803559363456817432411251507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858900971490967598526136554978189312978482168299894872265880485756401427047755513237964145152374623436454285844479526586782105114135473573952311342716610213596953623144295248493718711014576540359027993440374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927819119793995206141966342875444064374512371819217999839101591956181467514269123974894090718649423196156794520809514655022523160388193014209376213785595663893778708303906979207734672218256259966150142150306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856100550810665879699816357473638405257145910289706414011097120628043903975951567715770042033786993600723055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412671113699086585163983150197016515116851714376576183515565088490998985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656180937734440307074692112019130203303801976211011004492932151608424448596376698389522868478312355265821314495768572624334418930396864262434107732269780280731891544110104468232527162010526522721116603966655730925471105578537634668206531098965269186205647693125705863566201855810072936065987648611791045334885034611365768675324944166803962657978771855608455296541266540853061434443185867697514566140680070023787765913440171274947042056223053899456131407112700040785473326993908145466464588079727082668306343285878569830523580893306575740679545716377525420211495576158140025012622859413021647155097925923099079654737612551765675135751782966645477917450112996148903046399471329621073404375189573596145890193897131117904297828564750320319869151402870808599048010941214722131794764777262241425485454033215718530614228813758504306332175182979866223717215916077166925474873898665494945011465406284336639379003976926567214638530673609657120918076383271664162748888007869256029022847210403172118608204190004229661711963779213375751149595015660496318629472654736425230817703675159067350235072835405670403867435136222247715891504953098444893330963408780769325993978054193414473774418426312986080998886874132604721569516239658645730216315981931951673538129741677294786724229246543668009806769282382806899640048243540370141631496589794092432378969070697794223625082216889573837986230015937764716512289357860158816175578297352334460428151262720373431465319777741603199066554187639792933441952154134189948544473456738316249934191318148092777710386387734317720754565453220777092120190516609628049092636019759882816133231666365286193266863360627356763035447762803504507772355471058595487027908143562401451718062464362679456127531813407833033625423278394497538243720583531147711992606381334677687969597030983391307710987040859133746414428227726346594704745878477872019277152807317679077071572134447306057007334924369311383504931631284042512192565179806941135280131470130478164378851852909285452011658393419656213491434159562586586557055269049652098580338507224264829397285847831630577775606888764462482468579260395352773480304802900587607582510474709164396136267604492562742042083208566119062545433721315359584506877246029016187667952406163425225771954291629919306455377991403734043287526288896399587947572917464263574552540790914513571113694109119393251910760208252026187985318877058429725916778131496990090192116971737278476847268608490033770242429165130050051683233643503895170298939223345172201381280696501178440874519601212285993716231301711444846409038906449544400619869075485160263275052983491874078668088183385102283345085048608250393021332197155184306354550076682829493041377655279397517546139539846833936383047461199665385815384205685338621867252334028308711232827892125077126294632295639898989358211674562701021835646220134967151881909730381198004973407239610368540664319395097901906996395524530054505806855019567302292191393391856803449039820595510022635353619204199474553859381023439554495977837790237421617271117236434354394782218185286240851400666044332588856986705431547069657474585503323233421073015459405165537906866273337995851156257843229882737231989875714159578111963583300594087306812160287649628674460477464915995054973742562690104903778198683593814657412680492564879855614537234786733039046883834363465537949864192705638729317487233208376011230299113679386270894387993620162951541337142489283072201269014754668476535761647737946752004907571555278196536213239264061601363581559074220202031872776052772190055614842555187925303435139844253223415762336106425063904975008656271095359194658975141310348227693062474353632569160781547818115284366795706110861533150445212747392454494542368288606134084148637767009612071512491404302725386076482363414334623518975766452164137679690314950191085759844239198629164219399490723623464684411739403265918404437805133389452574239950829659122850855582157250310712570126683024029295252201187267675622041542051618416348475651699981161410100299607838690929160302884002691041407928862150784245167090870006992821206604183718065355672525325675328612910424877618258297651579598470356222629348600341587229805349896502262917487882027342092222453398562647669149055628425039127577102840279980663658254889264880254566101729670266407655904290994568150652653053718294127033693137851786090407086671149655834343476933857817113864558736781230145876871266034891390956200993936103102916161528813843790990423174733639480457593149314052976347574811935670911013775172100803155902485309066920376719220332290943346768514221447737939375170344366199104033751117354719185504644902636551281622882446257591633303910722538374218214088350865739177150968288747826569959957449066175834413752239709683408005355984917541738188399944697486762655165827658483588453142775687900290951702835297163445621296404352311760066510124120065975585127617858382920419748442360800719304576189323492292796501987518721272675079812554709589045563579212210333466974992356302549478024901141952123828153091140790738602515227429958180724716259166854513331239480494707911915326734302824418604142636395480004480026704962482017928964766975831832713142517029692348896276684403232609275249603579964692565049368183609003238092947
圆周率前9000位

网站验证 

 https://www.1415926pi.com/getIndex.html

公式计算结果

与网站公布的序列一致,所以计算正确!

圆周率的相对精确值可以通过计算机进行模拟出来。

结论:工欲善其事必先利其器,有了精确的计算公式,最终我们得到的结论也就正确了!

参考博文

使用 Python 计算 π 值

本人计算机小白一枚,对编程有浓厚兴趣,在此贴出自己的计算机学习历程,还有很多不足,望多多指教! 读书后发现好多的内容与具体专业有偏差,没来得及完成,虽然“有时间我就会做...”是人生最大的谎言,但有时间我会继续搞定未完成的内容,有始有终,兴趣使然!
原文地址:https://www.cnblogs.com/Robin5/p/11373912.html