home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Archive Magazine 1996
/
ARCHIVE_96.iso
/
discs
/
mag_discs
/
volume_2
/
issue_06
/
pi_stuff
/
PISTANDAL
< prev
Wrap
Text File
|
1988-12-29
|
3KB
|
110 lines
EMPTY
: NEWSTART SP! LP! RP! 0 MODE PAGE CR
." RiscFORTH. Stand alone program." CR CR
." PI calculator will calculate 1000 decimal places in about 33 seconds." CR
CR ." The speed depends on which mode you are in. MODE 0 appears to be the fastest." CR CR
'QUIT @EXECUTE ;
' NEWSTART ST-ADDR !
100000 CONSTANT base 5 CONSTANT dp
0 CONSTANT fa
0 CONSTANT A 0 CONSTANT B
0 CONSTANT X 0 CONSTANT Y
VARIABLE places
VARIABLE pointer 0 pointer !
VARIABLE plusminus 0 plusminus !
( Define 4 arrays )
: A% 4 * A + ; : B% 4 * B + ;
: X% 4 * X + ; : Y% 4 * Y + ;
( Dimension space for 4 arrays )
: DIM HERE TO A places @ 4 * ALLOT
HERE TO B places @ 4 * ALLOT
HERE TO X places @ 4 * ALLOT
HERE TO Y places @ 4 * ALLOT ;
( Print ALL 5 digits from cell)
: .CELL <# # # # # # #> TYPE SPACE ;
( .PI prints final value)
: .PI CR 0 Y% @ . ." ." places @ 1- 1
DO I DUP Y% @ .CELL 13 MOD 0=
IF 2 SPACES THEN LOOP CR ;
( INITialise A%[] & B%[] arrays )
: INIT places @ 0 DO
0 I A% ! 0 I B% ! LOOP 1 0 B% !
0 pointer ! 0 plusminus ! ;
( TAKE one cell from another )
: TAKE + 2DUP < IF SWAP base +
-: 1 ELSE - 0 THEN SWAP ;
( DIVide B%[] by number into B%[]. )
: DIVB pointer @ DUP >R B% @
OVER UM/MOD DUP R@ B% ! 0=
IF 1 pointer +! THEN base *
places @ R> 1+ 2DUP > IF DO I B% @
+ OVER UM/MOD I B% ! base * LOOP
ELSE 2DROP THEN 2DROP ;
( DIVide B%[] by number into A%[] )
: DIVA 0 places @ pointer @
1- DO I B% @ + OVER UM/MOD I A% !
base * LOOP 2DROP ;
( Copy B%[] to A%[] )
: B->A places @ 0
DO I B% @ I A% ! LOOP ;
( Add A%[] to X%[] )
: ADDAX 0 0 places @ 1- DO I A% @
I X% @ + + base UM/MOD
SWAP I X% ! -1 +LOOP DROP ;
( Add X%[] to Y%[]. )
: ADDXY 0 0 places @ 1- DO I X% @
I Y% @ + + base UM/MOD
SWAP I Y% ! -1 +LOOP DROP ;
( Take A%[] from X%[]. )
: TAKEAX 0 0 places @ 1-
DO I X% @ I A% @ ROT TAKE
I X% ! -1 +LOOP DROP ;
( Times X%[] by number. )
: TIMES 0 0 places @ 1- DO I X% @
2 PICK UM* + base UM/MOD
SWAP I X% ! -1 +LOOP 2DROP ;
( Accumulate ARCTAN series in X%[] )
: ACCUM 1 plusminus @ - DUP
plusminus ! IF ADDAX
ELSE TAKEAX THEN ;
( Calculate Arctan )
: ARCTAN DUP DUP INIT DIVB B->A
ACCUM 147 < IF DUP * 2 TO fa
ELSE 1 TO fa THEN
1 BEGIN OVER DIVB fa + DUP 2 MOD
IF DUP DIVA ACCUM
THEN pointer @ places @ 1- >
UNTIL 2DROP ;
( Add all arctan series into Y%[])
: PI 0 !TIME EMPTY 1- dp / 3 +
places ! DIM places @ 0
DO 0 I X% ! 0 I Y% ! LOOP
8 ARCTAN 24 TIMES ADDXY
places @ 0 DO 0 I X% ! LOOP
57 ARCTAN 8 TIMES ADDXY
places @ 0 DO 0 I X% ! LOOP
239 ARCTAN 4 TIMES ADDXY
.PI CR ." Time:= " @TIME
.TIME ." seconds" ;
: NEWQUIT BEGIN RP! CR ." Number of decimal places ?"
QUERY 32 WORD NUMBER CR PI CR AGAIN ;
PROTECT
HERE H.