π的近似值到底应该得多少?这直接关系到一个科学计算程序的质量。下面将来介绍经典割圆法求π的近似值。
先来看一个π取值的极为精确方法:
直接赋值法
#define PI 3.1415926535897932384626433832795023841971693993751058209749445923078164062862089986280348753421170679321480865132823066470938446095505822317253594081284811374502841027019385211059596446229489549303819644288109756650334461284756482337867831652712019091456485669234603486104543266182133936072602491412737245870066063155881748815209209628297540917153643678925903600113305305488204665213841459519415115094330572703657595919530921861173819326117931051185480744523799627495673518857527248912279381830119491298336713624405566430860213949463952247371907021798609437027705592171762931767523846748184676691051330005681271452635808277857713427527896091736371787214684409012245534301465495853310507922796892587235420199461121290219608640344181598136297347713099605187072113499999983729280499510597117328160963185950241594553469083026425223082533846850352619311881710100031378388658753320838142061217766914730359825349018875546873115956285388239378359375195778185778053217122680661300192787661119590921642919891809525730106548586327836153381827968230301952035301852064995773622972411897217752834791315155715574857242454150695950629535116861227855889075098181754637464939339255060400927701671139009848824012889
开了个玩笑,但是你要知道的是直接赋值法绝对是最常用的π的赋值方法。其他的方法就要显得略为笨拙,或者说是闭门造车 我们来介绍割圆法求π的近似值。
当圆内接多边形的边数N趋近于∞的时候,显然圆的面积S等于内接多边形的面积S'
显然我们可以推导出N为有限值的时候S≈S'
根据圆的面积公式则可以导出
显然的内接圆面积S'=Nds,其中ds为圆内接多边形被分割成N个小的三角形的面积,显然ds的值为下图所示
整理可得:
只需要把0.5N移到等式右边则可得到:
由还原法可得: x=Sin(x) 显然的只要知道x的值我们就可以得到π的值,同样x=0是显而易见的。
不禁有人要问难道π的值要得0不成。那么我要提醒你,这时候N的值是趋近于∞的
则有:
那么综上所述,我们不难得到一种粗糙的π的近似值的算法:
#include<math.h> double pi(int n) { double m,repi; m=sin(6.283185307179586476925286766559/n); repi=m*n/2; return repi; }
当然如果你愿意,直接把π的值赋值为3.1415926535897932384626433832795也可以,这里只是讲解一种割圆术的简单实现。通过多次求解使得π的值更加精确也是不错的选择:
#include<math.h> double pi(int n,int end) { double m,repi; if(end<=1) m=sin(6.283185307179586476925286766559/n); else m=sin(pi(n,end-1)/n); repi=m*n/2; return repi; }
看到这里,很多读者说,那我费了半天劲还不如直接赋值3.1415926535897932384626433832795呢下面就给大家一种脱离已知π值的方法(其实也是闭门造车)
#include<math.h> double(int n) { double s,h,x=1; int i=6; s=6*sqrt(3)/4; while(i<=(n*3)) { h=sqrt(1-pow((x/2),2)); s=s+i*x*(1-h)/2; x=sqrt(pow((x/2),2)+pow((1-h),2)); i=2*i; } return s; }
π的近似值的一些逼近和拟合的算法已经非常成熟,有兴趣的读者可以去网站搜索,这里只接受这一种π的近似值的经典求法。