#include stdio.h
成都創(chuàng)新互聯(lián)主營(yíng)高臺(tái)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),高臺(tái)h5小程序設(shè)計(jì)搭建,高臺(tái)網(wǎng)站營(yíng)銷推廣歡迎高臺(tái)等地區(qū)企業(yè)咨詢
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));
}
我寫過(guò)精確10000多位的,但代碼太多無(wú)法在此列出,我給你提供一個(gè)思路:
定義長(zhǎng)度為固定值的字節(jié)的數(shù)組當(dāng)做一個(gè)“大整數(shù)型”,長(zhǎng)度為BI_SIZE,數(shù)組的0號(hào)數(shù)為最低8位,往后是更高8位,以此類推。
考慮計(jì)算過(guò)程中的溢出問(wèn)題,BI_SIZE要盡量大,但也不能太大,否則算得會(huì)很慢。
#define
BI_SIZE
128
定義小數(shù)點(diǎn)后的十進(jìn)制位數(shù)PI_NUM,略大于100。
#define
PI_NUM
103
這樣的數(shù)組定義多個(gè),比如計(jì)算函數(shù)內(nèi)部用的工作寄存器如下:
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];
……
定義大整數(shù)相關(guān)處理函數(shù),包含拷貝、清零、比大小、加、減、乘、移位、除、轉(zhuǎn)十進(jìn)制ascii等函數(shù)。
比如大整數(shù)比大小,相等返回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;
}
凡是運(yùn)算函數(shù)都要使用輸入地址的方式,如大整數(shù)相加,將a與b相加后的值裝入地址c。
void
BigInteger_Add(uint8_t
*c,uint8_t
*a,uint8_t
*b);
調(diào)用每一個(gè)函數(shù)時(shí),輸出寄存器不能與輸入寄存器沖突。
寫除法函數(shù)可能比較難,請(qǐng)參考二進(jìn)制除法相關(guān)資料。
打印函數(shù)可以用連續(xù)除以10求余獲得。
函數(shù)準(zhǔn)備完成后就可以算圓周率了,先用循環(huán)算出10的PI_NUM次方作為標(biāo)準(zhǔn)系數(shù)EXP[BI_SIZE],計(jì)算每一項(xiàng)時(shí)分子要先乘EXP再除。由于你的級(jí)數(shù)公制性質(zhì),建議乘和除交替進(jìn)行,以免數(shù)字溢出。
每一項(xiàng)不斷累加起來(lái),直到當(dāng)前算得的項(xiàng)為0為止,累加結(jié)果轉(zhuǎn)十進(jìn)制打印出來(lái)。
調(diào)試時(shí)PI_NUM可以先改小,如果數(shù)字正確,就可以改為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));//使用系統(tǒng)函數(shù)cos計(jì)算
printf("cosx(%f)=%f\n",x,cosx(x));//使用泰勒公式計(jì)算
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
所以編程實(shí)現(xiàn)的話如下:
#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;
}