重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
成都创新互联主营高台网站建设的网络公司,主营网站建设方案,APP应用开发,高台h5小程序设计搭建,高台网站营销推广欢迎高台等地区企业咨询
double fun(double x,int n)
{
double result = 1.0;
double item = 1.0;
int i;
for (i = 1; i = n; i++)
{
item = item * x / i;
result += item;
}
return result;
}
int main()
{
double x;
int n;
scanf("%lf%d",x,n);
printf("%lf\n",fun(x,n));
}
我写过精确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多了。
#include "stdio.h"
#include "math.h"
#define PI 3.14156
float cosx(float x);
float fun_cos(float x, int m);
int main()
{
float x = PI/2;
printf("cos(%f)=%f\n",x,cos(x));//使用系统函数cos计算
printf("cosx(%f)=%f\n",x,cosx(x));//使用泰勒公式计算
return 0;
}
float fun_cos(float x, int m)
{
float ret_val;
int i;
if (m%2 == 0)
{ ret_val = 1.0;
}
else
{ ret_val = -1.0;
}
for (i=1;i=2*m;i++)
{ ret_val = ret_val * x/i;
}
return ret_val;
}
float cosx(float x)
{ float ret_val = 1.0;
float temp_ret;
int m = 1;
float Pi = 3.1415926;
if (x 2*Pi || x -2*Pi)
{ x = x-((int)(x/(2*Pi)))*(2*Pi);
}
do
{
temp_ret =fun_cos(x,m++);
ret_val += temp_ret;
}
while (temp_ret0.00005 || temp_ret-0.00005);
return ret_val;
}
1+3+5+...+(2n-1) = n(1+2n-1)/2 = n^2
1^2+2^2+3^2+n^2 = n(n+1)(2n+1)/6
所以编程实现的话如下:
#include "stdio.h"
int main ()
{
int n,ret;
printf("please input a integer n:");
scanf("%d",n);
while(n 0)
{
ret = n*(n+1)*(2*n+1)/6;
printf("result : %d\n",ret);
printf("please input a integer n:");
scanf("%d",n);
}
return 0;
}