C语言程序设计,用级数计算圆周率π

Python026

C语言程序设计,用级数计算圆周率π,第1张

我写过精确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多了。

一、数学公式:

圆周长=2*π*半径

面积=π*半径²

二、算法分析:

周长和面积都依赖半径,所以要先输入半径值,然后套用公式,计算周长和面积。 最终输出结果即可。

三、参考代码:

代码如下

#include "stdio.h"

#define Pi 3.14

void main()

{

float r,c,area

printf("请输入圆的半径:")

scanf("%f",&r)

c=2*Pi*r

area=Pi*r*r

printf("该圆的周长是%.2f,面积是%.2f\n",c,area)

}