C语言程序设计,用级数计算圆周率π 60
C++程序设计,用级数计算圆周率π要求:采用级数:π/2=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+……+(1*2*…n)/(3*5*…(2n+...
C++程序设计,用级数计算圆周率π
要求:采用级数: π/2 = 1 + 1/3 + (1*2)/(3*5) +(1*2*3)/(3*5*7) + …… +(1*2*…n)/(3*5*…(2n+1)) =1+1/3*(1+2/5*(1+……+(n-1)/(2n-1)*(1+n/(2n+1)......) 且精确到小数点后100位。
求大神啊!!!!!要用上面列的级数的方法求。。。
注意!!!!!
要用上面的级数方法啊!!!!
而且要保留到小数点后100位啊·!!!!!!! 展开
要求:采用级数: π/2 = 1 + 1/3 + (1*2)/(3*5) +(1*2*3)/(3*5*7) + …… +(1*2*…n)/(3*5*…(2n+1)) =1+1/3*(1+2/5*(1+……+(n-1)/(2n-1)*(1+n/(2n+1)......) 且精确到小数点后100位。
求大神啊!!!!!要用上面列的级数的方法求。。。
注意!!!!!
要用上面的级数方法啊!!!!
而且要保留到小数点后100位啊·!!!!!!! 展开
3个回答
展开全部
#include<stdio.h>
int main()
{
double 乎尘pi=2.0;
double i=1.0;
double a= i;
码亩double b= 2*i+1;
double t=2*a/b;
岁模禅while(t>=1e-100)
{
pi = pi + t;
i=i+1;
a=a*i;
b=b*(2*i+1);
t=2*a/b;
}
printf("%g\n",pi);
getchar();
}
追问
没有精确到小数点后100位啊。。
追答
精确到小数点后100位,要使用高精度加法,乘法和除法。
展开全部
我写过精确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 - 1;i < BI_SIZE;i --)
{
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多了。
定义长度为固定值的字节的数组当做一个“大整数型”,长度为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 - 1;i < BI_SIZE;i --)
{
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多了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
void main(){
long double t = 1.0 ;
long double s = 1.0;
long double x = t/s;
long double p = 0.0;
long double pi = 0.0 ;
long double n = 1.0;
while( x >( 1.0e-100) ){
n = n+ 1.0;
t = t * n;
s = s * (2.0*n-1.0);
x = t/闭裂胡s;
p = p + x;
}
pi = p*2.0;
printf("轿拦pi = %10.100lf"源旁 ,pi);
}
void main(){
long double t = 1.0 ;
long double s = 1.0;
long double x = t/s;
long double p = 0.0;
long double pi = 0.0 ;
long double n = 1.0;
while( x >( 1.0e-100) ){
n = n+ 1.0;
t = t * n;
s = s * (2.0*n-1.0);
x = t/闭裂胡s;
p = p + x;
}
pi = p*2.0;
printf("轿拦pi = %10.100lf"源旁 ,pi);
}
追问
小数点十几位后开始后面都是0了 是无效的好么。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询