Paso 1: El código
define otra charla (echo en) (eco apagado)setlocal EnableDelayedExpansion
echo.PI.bat - Don Cruz - http://cosinekitty.com
Set /a NumQuads = 30
Set /a MaxQuadIndex = NumQuads - 1
echo.
echo.%Time% - iniciado
echo.
llamar: PiEngine 48 18 32 57-20 239
llamar: PiEngine 16 5-4 239
GOTO: EOF
: PiEngine
llamar: SetToInteger Pi 0
establecer la fórmula =
: PiTermLoop
if "%1" == "" (
Llame al: pi de la impresión
echo.
echo.! ¡ tiempo! -terminado! ¡ Fórmula!
echo.
GOTO: EOF
)
llamar: ArctanRecip PiTerm %2
Set /a PiEngineFactor = %1
If! PiEngineFactor! (LSS 0
Set /a PiEngineFactor * = -1
establecer la fórmula =! ¡ Fórmula!
llamar: MultiplyByInteger PiTerm! PiEngineFactor!
llamar: restar Pi PiTerm
sistema operador =-
) () otro
llamar: MultiplyByInteger PiTerm %1
llamar: Añadir Pi PiTerm
sistema operador = +
)
Si se ha definido (fórmula
establecer la fórmula =! Fórmula!! Operador!! PiEngineFactor!*arctan^(1/%2^)
) () otro
establecer la fórmula = pi = %1*arctan^(1/%2^)
)
cambio
cambio
Goto PiTermLoop
: SetToInteger
para /L % % en (0, 1,! MaxQuadIndex!) hacer)
Set /a % 1_ %% i = 0
)
Set /a % 1_! MaxQuadIndex! = %2
GOTO: EOF
: Impresión
establecer PrintBuffer = x
REM omitir un par de quads menos importantes, porque tienen errores del roundoff.
Si define () PiDebug
Set /a PrintMinQuadIndex = 0
) () otro
Set /a PrintMinQuadIndex = 2
)
Set /a PrintMaxQuadIndex = MaxQuadIndex - 1
para /L % % en (! PrintMinQuadIndex!, 1,! PrintMaxQuadIndex!) hacer)
Set PrintDigit =! % 1_ %% yo!
If! PrintDigit! (LSS 1000
If! PrintDigit! (LSS 100
If! PrintDigit! (LSS 10
Set PrintDigit = 000! PrintDigit!
) () otro
Set PrintDigit = 00! PrintDigit!
)
) () otro
Set PrintDigit = 0! PrintDigit!
)
)
establecer PrintBuffer =! PrintDigit! PrintBuffer!
)
establecer PrintBuffer =. 1_ % MaxQuadIndex %!.! PrintBuffer:x =!
echo.%1 =! PrintBuffer!
GOTO: EOF
: DivideByInteger
Si define PiDebug eco. DivideByInteger %1 %2
Set /a DBI_Carry = 0
para /L % % en (! MaxQuadIndex!, -1, 0) ()
Set /a DBI_Digit = DBI_Carry * 10000 + 1_ % %% i
Set /a DBI_Carry = DBI_Digit %% %2
Set /a % 1_ %% i = DBI_Digit / %2
)
GOTO: EOF
: MultiplyByInteger
Si define PiDebug eco. MultiplyByInteger %1 %2
Set /a MBI_Carry = 0
para /L % % en (0, 1,! MaxQuadIndex!) hacer)
Set /a MBI_Digit = 1_ % %% i * %2 + MBI_Carry
Set /a % 1_ %% i = MBI_Digit %% 10000
Set /a MBI_Carry = MBI_Digit / 10000
)
GOTO: EOF
: ArctanRecip
Si define PiDebug eco. ArctanRecip %1 %2
llamar: SetToInteger %1 1
llamar: DivideByInteger %1 %2
llamar: CopyValue AR_Recip %1
Set /a AR_Toggle = -1
Set /a AR_K = 3
: ArctanLoop
Si define () PiDebug
echo.
echo. ArctanRecip AR_K =! AR_K! ---------------------------------------------------------
)
llamar: DivideByInteger AR_Recip %2
llamar: DivideByInteger AR_Recip %2
llamar: CopyValue AR_Term AR_Recip
llamar: DivideByInteger AR_Term! AR_K!
llamar: CopyValue AR_PrevSum %1
Si! AR_Toggle! (LSS 0
llamar: restar %1 AR_Term
) () otro
llamar: Añadir %1 AR_Term
)
llamar: comparar AR_EqualFlag %1 AR_PrevSum
Si! AR_EqualFlag! == true goto: EOF
Set /a AR_K += 2
Set /a AR_Toggle * = -1
Goto ArctanLoop
: CopyValue
Si define PiDebug eco. CopyValue %1 %2
para /L % % en (0, 1,! MaxQuadIndex!) hacer)
Set /a % 1_ %% i = 2% %% i
)
GOTO: EOF
: Añadir
Si define PiDebug eco. Añadir %1 %2
Si define PiDebug llamada: impresión %1
Si define PiDebug llamada: imprimir %2
Set /a Add_Carry = 0
para /L % % en (0, 1,! MaxQuadIndex!) hacer)
Set /a Add_Digit = Add_Carry + % 1_ %% i + % 2_ %% i
Set /a % 1_ %% i = Add_Digit %% 10000
Set /a Add_Carry = Add_Digit / 10000
)
GOTO: EOF
: Restar
Si define PiDebug eco. Restar el %1 %2
Si define PiDebug llamada: impresión %1
Si define PiDebug llamada: imprimir %2
Set /a Subtract_Borrow = 0
para /L % % en (0, 1,! MaxQuadIndex!) hacer)
Set /a Subtract_Digit = 1_ % %% i - 2_ % %% i - Subtract_Borrow
If! Subtract_Digit! (LSS 0
Set /a Subtract_Digit += 10000
Set /a Subtract_Borrow = 1
) () otro
Set /a Subtract_Borrow = 0
)
Set /a % 1_ %% i = Subtract_Digit
)
GOTO: EOF
: Comparar
Si define PiDebug echo.Compare %1 %2 %3
Si define PiDebug llamada: imprimir %2
Si define PiDebug llamada: imprimir %3
Set /a Compare_Index = 0
Set 1% = true
: CompareLoop
Si no! % 2% Compare_Index %! ==. 3_ % Compare_Index %! (
Si define PiDebug echo.! 2_ % Compare_Index %! NEQ! 3_ % Compare_Index %!
Set 1% = false
GOTO: EOF
)
Set /a Compare_Index += 1
If! Compare_Index! GTR! MaxQuadIndex! (
Si define PiDebug echo.Compare igual
GOTO: EOF
)
Goto CompareLoop
REM $Log: $ pi.bat,v
REM revisión 1.2 2007/09/06 21:49:15 Don.Cross
REM añade sellos de tiempo y visualización de la fórmula.
REM
REM revisión 1.1 2007/09/06 21:12:36 Don.Cross
REM archivo de cálculo de pi
REM
Es el código guardar como pi.bat o lo que quieras .bat