『壹』 C語言程序設計,用級數計算圓周率π
我寫過精確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多了。
『貳』 C語言編程求出圓周率的近似值。
#include <stdio.h>
int main()
{
double pi;
unsigned long i,n;
scanf("%lu",&n);
for(pi=1,i=1;i<=n;++i)
{
pi*=(i+1)/2*2.0 / ( (i+1)/2*2+(i-1)%2*2-1 );
}
printf("pi=%.10lf ",pi*=2);
return 0;
}
『叄』 C語言計算圓周率
#include<stdio.h>
#include<math.h>
intmain(){
doublep=0,q=0;
inti;
for(i=1;;i++){
p+=6*1.0/(i*i);
q+=4*1.0*pow(-1,i+1)/(2*i-1);//q後面少一個+
if(fabs(sqrt(p)-q)<1e-6)
break;
}
printf("PIis%lf,項數為%d",q,i);
return0;
}