Beräkna pi med baken arkivera (1 / 2 steg)
Steg 1: Koden
definierade talk (echo på) annars (echo off)SETLOCAL EnableDelayedExpansion
ECHO.PI.bat - av Don Cross - http://cosinekitty.com
Ange/a NumQuads = 30
Ange/a MaxQuadIndex = NumQuads - 1
ECHO.
ECHO.%Time% - började
ECHO.
ring: PiEngine 48 18 32 57-20 239
ring: PiEngine 16 5-4 239
GOTO: EOF
: PiEngine
ring: SetToInteger Pi 0
Ange formeln =
: PiTermLoop
if "%1" == "" (
ring: Skriv ut pi
ECHO.
ECHO.! tid! -färdig! Formel!
ECHO.
GOTO: EOF
)
ring: ArctanRecip PiTerm %2
Ange/a PiEngineFactor = %1
om! PiEngineFactor! () LSS 0
Ange/a PiEngineFactor * = -1
Ange formeln =! Formel!
ring: MultiplyByInteger PiTerm! PiEngineFactor!
ring: subtrahera Pi PiTerm
Ange operatör =-
) annat ()
ring: MultiplyByInteger PiTerm %1
ring: lägga till Pi PiTerm
Ange operatör = +
)
om definierade formel)
Ange formeln =! Formeln!! Operatören!! PiEngineFactor!*arctan^(1/%2^)
) annat ()
Ange formeln = pi = %1*arctan^(1/%2^)
)
Skift
Skift
gå till PiTermLoop
: SetToInteger
för/l % i (0, 1,! MaxQuadIndex!) göra)
Ange/a % 1_ %% jag = 0
)
Set/a % 1_! MaxQuadIndex! = %2
GOTO: EOF
: Skriv ut
Ange PrintBuffer = x
REM utelämna ett par minst signifikanta fyrhjulingar, eftersom de kommer att ha roundoff fel.
om definierat () PiDebug
Ange/a PrintMinQuadIndex = 0
) annat ()
Ange/a PrintMinQuadIndex = 2
)
Ange/a PrintMaxQuadIndex = MaxQuadIndex - 1
för/l % i (!) PrintMinQuadIndex!, 1,! PrintMaxQuadIndex!) göra)
Ange PrintDigit =! % 1_ %% jag!
om! PrintDigit! () LSS 1000
om! PrintDigit! () LSS 100
om! PrintDigit! () LSS 10
Ange PrintDigit = 000! PrintDigit!
) annat ()
Ange PrintDigit = 00! PrintDigit!
)
) annat ()
Ange PrintDigit = 0! PrintDigit!
)
)
Ange PrintBuffer =! PrintDigit!! PrintBuffer!
)
Ange PrintBuffer =! % 1_ % MaxQuadIndex %!.! PrintBuffer:x =!
ECHO.%1 =! PrintBuffer!
GOTO: EOF
: DivideByInteger
om definierade PiDebug echo. DivideByInteger %1 %2
Ange/a DBI_Carry = 0
för/l % i (!) MaxQuadIndex!, -1, 0) göra ()
Ange/a DBI_Digit = DBI_Carry * 10000 + % 1_ %% jag
Ange/a DBI_Carry = DBI_Digit %% %2
Ange/a % 1_ %% jag = DBI_Digit / %2
)
GOTO: EOF
: MultiplyByInteger
om definierade PiDebug echo. MultiplyByInteger %1 %2
Ange/a MBI_Carry = 0
för/l % i (0, 1,! MaxQuadIndex!) göra)
Ange/a MBI_Digit = % 1_ %% jag * %2 + MBI_Carry
Ange/a % 1_ %% jag = MBI_Digit %% 10000
Ange/a MBI_Carry = MBI_Digit / 10000
)
GOTO: EOF
: ArctanRecip
om definierade PiDebug echo. ArctanRecip %1 %2
ring: SetToInteger %1 1
ring: DivideByInteger %1 %2
ring: CopyValue AR_Recip %1
Ange/a AR_Toggle = -1
Ange/a AR_K = 3
: ArctanLoop
om definierat () PiDebug
ECHO.
ECHO. ArctanRecip AR_K =! AR_K! ---------------------------------------------------------
)
ring: DivideByInteger AR_Recip %2
ring: DivideByInteger AR_Recip %2
ring: CopyValue AR_Term AR_Recip
ring: DivideByInteger AR_Term! AR_K!
ring: CopyValue AR_PrevSum %1
om! AR_Toggle! () LSS 0
ring: subtrahera %1 AR_Term
) annat ()
ring: lägga till %1 AR_Term
)
ring: jämföra AR_EqualFlag %1 AR_PrevSum
om! AR_EqualFlag! == true goto: EOF
Ange/a AR_K += 2
Ange/a AR_Toggle * = -1
gå till ArctanLoop
: CopyValue
om definierade PiDebug echo. CopyValue %1 %2
för/l % i (0, 1,! MaxQuadIndex!) göra)
Ange/a % 1_ %% jag = % 2_ %% jag
)
GOTO: EOF
: Lägga till
om definierade PiDebug echo. Lägga till %1 %2
om definierat PiDebug samtal: skriva ut %1
om definierat PiDebug samtal: skriva ut %2
Ange/a Add_Carry = 0
för/l % i (0, 1,! MaxQuadIndex!) göra)
Ange/a Add_Digit = Add_Carry + % 1_ %% + % 2_ %% jag
Ange/a % 1_ %% jag = Add_Digit %% 10000
Ange/a Add_Carry = Add_Digit / 10000
)
GOTO: EOF
: Subtrahera
om definierade PiDebug echo. Subtrahera %1 %2
om definierat PiDebug samtal: skriva ut %1
om definierat PiDebug samtal: skriva ut %2
Ange/a Subtract_Borrow = 0
för/l % i (0, 1,! MaxQuadIndex!) göra)
Ange/a Subtract_Digit = % 1_ %% i - % 2_ %% i - Subtract_Borrow
om! Subtract_Digit! () LSS 0
Ange/a Subtract_Digit += 10000
Ange/a Subtract_Borrow = 1
) annat ()
Ange/a Subtract_Borrow = 0
)
Ange/a % 1_ %% jag = Subtract_Digit
)
GOTO: EOF
: Jämför
om definierat PiDebug echo.Compare %1 %2 %3
om definierat PiDebug samtal: skriva ut %2
om definierat PiDebug samtal: skriva ut %3
Ange/a Compare_Index = 0
ställa in %1 = sant
: CompareLoop
om inte! % 2_ % Compare_Index %! ==! % 3_ % Compare_Index %! (
om definierat PiDebug eko.! 2_ % Compare_Index %! NEQ! % 3_ % Compare_Index %!
ställa in %1 = false
GOTO: EOF
)
Ange/a Compare_Index += 1
om! Compare_Index! GTR! MaxQuadIndex! (
om definierat PiDebug echo.Compare lika
GOTO: EOF
)
gå till CompareLoop
REM $Log: pi.bat,v $
REM revidering 1.2 2007/09/06 21:49:15 Don.Cross
REM lagt tidsstämplar och visning av formeln.
REM
REM Revision 1.1 2007/09/06 21:12:36 Don.Cross
REM Kommandofil för beräkning av pi
REM
Det är koden spara den som pi.bat eller något du vill .bat