{\color{Blue} \pi =16\arctan \left ( \frac{1}{5} \right )-4\arctan \left ( \frac{1}{239} \right )}
在展开成两个级数之和,然后整理得到:
PI=16x(1/5-1/(5^3/3)+1/(5^5/5)-1/(5^7/7)+...)-4x(1/239-1/(239^3/3)+1/(239^5/5)-1/(239^7/7)+...)
=4x(4x5/25-239/57121)/1-4x(4x5/25^2-239/57121^2)/3+4x(4x5/25^3-239/57121^3)/5-
Module PI_Calc_Mod
Implicit None
Integer , public , parameter :: PI_KIND = KIND(1)
Private :: GenPI , Rot
contains
Subroutine CalcPI( nBit , myPI )
Integer , Intent( IN ) :: nBit
integer(Kind=PI_KIND) :: myPI(nBit),bitA(nBit),bitB(nBit),BitAs(nBit),BitBs(nBit),BitPIA(nBit),BitPIB(nBit)
integer :: i
myPI(:)=0
bitA(:)=0
bitB(:)=0
BitAs(:)=0
BitBs(:)=0
BitPIA(:)=0
BitPIB(:)=0
BitAs(2)=3
BitAs(3)=2
BitBs(2)=4
call Rot( nBit , BitBs , bitB , BitBs , 239 )
call GenPI( nBit , myPI , BitBs , BitAs )
Do i = 1 , nBit
call Rot( nBit , BitAs , bitA , BitAs , 25 )
call Rot( nBit , BitAs , bitA , BitPIA , 2*i+1 )
call Rot( nBit , BitBs , bitB , BitBs , 57121 )
call Rot( nBit , BitBs , bitB , BitPIB , 2*i+1 )
if( mod(i,2) == 1 ) then
call GenPI( nBit , myPI , BitPIA , BitPIB )
else
call GenPI( nBit , myPI , BitPIB , BitPIA )
end if
End Do
End Subroutine CalcPI
Subroutine Rot( nBit , nA , nB , nC , nM )
Integer , Intent( IN ) :: nBit , nM
Integer(Kind=PI_KIND) , Intent( INOUT ) :: nA(nBit) , nB(nBit) , nC(nBit)
integer :: i , j
Do i = 2 , nBit
j = mod( nB(i-1) , nM ) * 10 + nA( i )
nC(i) = j / nM
nB(i) = mod( j , nM )
End Do
End Subroutine Rot
Subroutine GenPI( nBit , nPI , npA , npB )
Integer , Intent( IN ) :: nBit
Integer(Kind=PI_KIND) , Intent( INOUT ) :: nPI(nBit) , npA(nBit) , npB(nBit)
integer :: i
nPI(2:nBit)=nPI(2:nBit)+npB(2:nBit)
Do i = nBit , 2 , -1
if( nPI(i) >= npA(i) ) then
nPI(i) = nPI(i) - npA(i)
else
nPI(i) = nPI(i) + 10 - npA(i)
nPI(i-1) = nPI(i-1) - 1
end if
nPI(i-1) = nPI(i-1) + nPI(i) / 10
nPI(i) = mod( nPI(i) , 10 )
End Do
End Subroutine GenPI
End Module PI_Calc_Mod
Program www_fcode_cn
use PI_Calc_Mod
Implicit None
Integer , parameter :: N = 100
integer(Kind=PI_KIND) :: myPI(N)
call CalcPI( N , myPI )
write(*,'(50i1)') myPI
End Program www_fcode_cn



