转载

π的近似值到底得多少

π的近似值到底应该得多少?这直接关系到一个科学计算程序的质量。下面将来介绍经典割圆法求π的近似值。

先来看一个π取值的极为精确方法:

直接赋值法

#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; } 

π的近似值的一些逼近和拟合的算法已经非常成熟,有兴趣的读者可以去网站搜索,这里只接受这一种π的近似值的经典求法。

关注我是一个明智之举。

原文  http://www.ituring.com.cn/article/210777
正文到此结束
Loading...