Stap 1: De code
talk (echo op) anders gedefinieerd (echo uitschakelen)setlocal EnableDelayedExpansion
ECHO.pi.bat - door Don Cross - http://cosinekitty.com
set /a NumQuads = 30
set /a MaxQuadIndex = NumQuads - 1
ECHO.
ECHO.%time% - begonnen
ECHO.
Bel: PiEngine 48 18 32 57-20 239
Bel: PiEngine 16-5-4 239
goto: EOF
: PiEngine
Bel: SetToInteger Pi 0
instellen van de formule =
: PiTermLoop
if "%1" == "" (
Bel: Print pi
ECHO.
ECHO.! tijd! -klaar! Formule!
ECHO.
goto: EOF
)
Bel: ArctanRecip PiTerm %2
set /a PiEngineFactor = %1
Als! PiEngineFactor! LSS 0)
set /a PiEngineFactor * = -1
instellen van de formule =! Formule!
Bel: MultiplyByInteger PiTerm! PiEngineFactor!
Bel: aftrekken Pi PiTerm
instellen van de Operator =-
) anders ()
Bel: MultiplyByInteger PiTerm %1
Bel: Pi PiTerm toevoegen
instellen van de Operator = +
)
als formule (gedefinieerd
instellen van de formule =! Formule!! Exploitant!! PiEngineFactor!*arctan^(1/%2^)
) anders ()
instellen van de formule = pi = %1*arctan^(1/%2^)
)
Shift
Shift
goto PiTermLoop
: SetToInteger
voor/l % in (0, 1,! MaxQuadIndex!) doen)
set /a % 1_ %% ik = 0
)
set /a % 1_! MaxQuadIndex! %2 =
goto: EOF
: Afdrukken
set PrintBuffer = x
REM weglaten, een paar van de minst significante quads, omdat zij afrondingsfouten zullen hebben.
Als PiDebug (gedefinieerd
set /a PrintMinQuadIndex = 0
) anders ()
set /a PrintMinQuadIndex = 2
)
set /a PrintMaxQuadIndex = MaxQuadIndex - 1
voor/l % in (! PrintMinQuadIndex!, 1,! PrintMaxQuadIndex!) doen)
set PrintDigit =! % 1_ %% ik!
Als! PrintDigit! LSS 1000)
Als! PrintDigit! LSS 100)
Als! PrintDigit! LSS 10)
set PrintDigit = 000! PrintDigit!
) anders ()
set PrintDigit = 00! PrintDigit!
)
) anders ()
set PrintDigit = 0! PrintDigit!
)
)
set PrintBuffer =! PrintDigit!! PrintBuffer!
)
set PrintBuffer =! % 1_ % MaxQuadIndex %!.! PrintBuffer:x =!
ECHO.%1 =! PrintBuffer!
goto: EOF
: DivideByInteger
als gedefinieerd PiDebug echo. DivideByInteger %1 %2
set /a DBI_Carry = 0
voor/l % in (! MaxQuadIndex!, -1, 0) doen ()
set /a DBI_Digit = DBI_Carry * 10000 + % 1_ %% ik
set /a DBI_Carry = DBI_Digit %% %2
set /a % 1_ %% ik = DBI_Digit / %2
)
goto: EOF
: MultiplyByInteger
als gedefinieerd PiDebug echo. MultiplyByInteger %1 %2
set /a MBI_Carry = 0
voor/l % in (0, 1,! MaxQuadIndex!) doen)
set /a MBI_Digit = % 1_ %% ik * %2 + MBI_Carry
set /a % 1_ %% ik = MBI_Digit %% 10000
set /a MBI_Carry = MBI_Digit / 10000
)
goto: EOF
: ArctanRecip
als gedefinieerd PiDebug echo. ArctanRecip %1 %2
Bel: SetToInteger %1 1
Bel: DivideByInteger %1 %2
Bel: CopyValue AR_Recip %1
set /a AR_Toggle = -1
set /a AR_K = 3
: ArctanLoop
Als PiDebug (gedefinieerd
ECHO.
ECHO. ArctanRecip AR_K =! AR_K! ---------------------------------------------------------
)
Bel: DivideByInteger AR_Recip %2
Bel: DivideByInteger AR_Recip %2
Bel: CopyValue AR_Term AR_Recip
Bel: DivideByInteger AR_Term! AR_K!
Bel: CopyValue AR_PrevSum %1
Als! AR_Toggle! LSS 0)
Bel: %1 AR_Term aftrekken
) anders ()
Bel: %1 AR_Term toevoegen
)
Bel: AR_EqualFlag %1 AR_PrevSum vergelijken
Als! AR_EqualFlag! == true goto: EOF
/a AR_K += 2 instellen
set /a AR_Toggle * = -1
goto ArctanLoop
: CopyValue
als gedefinieerd PiDebug echo. CopyValue %1 %2
voor/l % in (0, 1,! MaxQuadIndex!) doen)
set /a % 1_ %% ik = % 2_ %% ik
)
goto: EOF
: Toevoegen
als gedefinieerd PiDebug echo. %1 %2 toevoegen
als gedefinieerd PiDebug oproep: afdrukken van %1
als gedefinieerd PiDebug oproep: %2 afdrukken
set /a Add_Carry = 0
voor/l % in (0, 1,! MaxQuadIndex!) doen)
set /a Add_Digit = Add_Carry + % 1_ %% i + % 2_ %% ik
set /a % 1_ %% ik = Add_Digit %% 10000
set /a Add_Carry = Add_Digit / 10000
)
goto: EOF
: Aftrekken
als gedefinieerd PiDebug echo. %1 %2 aftrekken
als gedefinieerd PiDebug oproep: afdrukken van %1
als gedefinieerd PiDebug oproep: %2 afdrukken
set /a Subtract_Borrow = 0
voor/l % in (0, 1,! MaxQuadIndex!) doen)
set /a Subtract_Digit = % 1_ %% i - % 2_ %% i - Subtract_Borrow
Als! Subtract_Digit! LSS 0)
/a Subtract_Digit += 10000 instellen
set /a Subtract_Borrow = 1
) anders ()
set /a Subtract_Borrow = 0
)
set /a % 1_ %% ik = Subtract_Digit
)
goto: EOF
: Vergelijken
Als PiDebug echo.Compare %1 %2 %3 gedefinieerd
als gedefinieerd PiDebug oproep: %2 afdrukken
als gedefinieerd PiDebug oproep: %3 afdrukken
set /a Compare_Index = 0
instellen %1 = true
: CompareLoop
zoniet! % 2_ % Compare_Index %! ==! % 3_ % Compare_Index %! (
Als PiDebug echo gedefinieerd.! 2_ % Compare_Index %! neq! % 3_ % Compare_Index %!
instellen %1 = false
goto: EOF
)
/a Compare_Index += 1 instellen
Als! Compare_Index! GTR! MaxQuadIndex! (
als gedefinieerd PiDebug echo.Compare gelijk
goto: EOF
)
goto CompareLoop
REM $Log: pi.bat,v $
REM revisie 1.2 2007/09/06 21:49:15 Don.Cross
Tijdstempels REM toegevoegd en weergave van de formule.
REM
REM Revision 1.1 06/09/2007 21:12:36 Don.Cross
REM batchbestand voor het berekenen van pi
REM
Dat is de code opslaan als pi.bat of om het even wat u wilt .bat