那个计算π的C语言程序是怎么写的啊?

那个计算π的C语言程序是怎么写的啊?,第1张

1、PI  的值可以通过以下公式计算出来,

π/4=1-1/3+1/5-1/7……

编写循环程序,当这种计算方法所得到的偏差小于0.000001时停止计算,并输出PI的值及所需要计算的项数。

2、例程:

double s = 0//面积

        double pi = 0//圆周率

        double d=200//直径(值越大圆周率越精确)

        double r = d/2//半径

        for(int i=1i<=di++){

            for(int j=1j<=dj++){

                if((i-r)*(i-r)+(j-r)*(j-r)<=r*r){

                    历滑物    s++

  肢液              }

            }

     让野   }

        pi = s/(r*r)

一个足以让渗伏你吐血的计算400位pi的C程序:

int a=10000, b, c=2800, d, e, f[2801], g

main() {

for(b-cf[b++]=a/5)

for(d=0,g=c*2c -=14,printf("%.4d"纯渗,e+d/a),e=d%a)

for(b=cd+=f[b]*a,f[b]=d%--g,d/=g--,--bd*=b)

}

理论上只要用大数算法扩了就能一直算下去。我在Palm上面实现的那个就是基于这个算法,没有扩,算到4680位(受到Palm平台32k数组的长度限制)。

这个程序的特点是:你抱着想看看算pi原理的希望来读这个程序,结果发现就是看了也还是看不懂~~

转的,但是百度知道不允许贴地址哦

第二种:

用C语言编程π*π/6=1/1*1+1/2*2+1/3*3+。。。+1/n*n

#include<stdio.h>

#include<math.h>

main()

{

int n,i

double s=0

printf("输入n:")

scanf("%d",&n)

for(i=1i<=ni++)

{s=s+1.0/(i*i)

}

printf("pai=%f",sqrt(s*6))

}

第三种:

求pi=(1+1/做喊脊(1*3))*(1+1/(3*5))*(1+1/(5*7))…………直到最后一项的分数小于10的负6次方为止。

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

void main()

{

double pi,i,j,sigh,term

i=1,j=3,sigh=1,term=1

while(sigh>1e-6)

{

sigh=1/(i*j)

term=(1+sigh)*term

i=i+2

j=j+2

}

pi=term

printf("pi=%f\n",pi)

}

我写过精确10000多位的,但代码太多无法在此列出,我给你提供一个思路:

定义长度为固定值销绝的字节的数组当做一个“大整数型”,长度为BI_SIZE,数组的0号数为最低8位,往后是更高8位,以此类推。

考虑计算过程中的溢出问题,BI_SIZE要尽量大,但也不能太大,否则算得会很慢。

#define

BI_SIZE

128

定义小数点后的十进制位数PI_NUM,略大于100。

#define

PI_NUM

103

这样的数组定义多个,比如计算函数内部用的工作寄存器如下:

uint8_t

R0[BI_SIZE]

uint8_t

R1[BI_SIZE]

uint8_t

R2[BI_SIZE]

……

用户使用的寄存器如下:

uint8_t

a0[BI_SIZE]

uint8_t

a1[BI_SIZE]

uint8_t

a2[BI_SIZE]

……

定义大整数相关处理函数,包含拷贝、清零、比大小、加、减、乘、移位、除、转十进制ascii等函数。

比如大整数比大小,相等返回0,a大返回1,b大返回-1。

int

BigInteger_Cmp(uint8_t

*a,uint8_t

*b)

{

uint32_t

i

for(i

=

BI_SIZE

-

1i

<

BI_SIZEi

--)

{

if(a[i]

!=

b[i])

{

if(a[i]

>

b[i])

return

1

else

return

-1

}

}

return

0

}

凡是运算函数都要使用输入地址的方式,如大整数相加,将a与b相加后的值装入地址c。

void

BigInteger_Add(uint8_t

*c,uint8_t

*a,uint8_t

*b)

调用每一慎扰个函数时,输出寄存器不能与输入寄存器冲突。

写除法函数可能比较难,请参考二进制除法相关资料。

打印函数可以用连续除以10求余获得。

函数准备完成后就可以算圆周率了,先用循环算出10的PI_NUM次方作为标准系数EXP[BI_SIZE],计算每一项时分子要先乘EXP再除。由于你的级数公制性质,建议乘和除交替进行,以免数字溢亏孝姿出。

每一项不断累加起来,直到当前算得的项为0为止,累加结果转十进制打印出来。

调试时PI_NUM可以先改小,如果数字正确,就可以改为100多了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12385312.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存