CONST WORDS = 100
CONST NUMWORDS = WORDS + 1
CLS
DIM SUM(1 TO NUMWORDS) AS LONG, TERM(1 TO NUMWORDS) AS INTEGER
DIM DENOM AS LONG, FIRSTWORD AS INTEGER, LASTWORD AS INTEGER
DIM SIGN AS INTEGER
DIM I AS INTEGER, TEMP AS LONG, TEMP2 AS LONG
DIM DIVIDEND AS LONG, R1 AS LONG, R2 AS LONG, R3 AS LONG, R4 AS LONG
' 16 * ATN(1/5) - 4 * ATN(1/239)
' See http://en.wikipedia.org/wiki/Taylor_series for formula because N54 will probably wreck my
' ASCII art rendition of it
' Divide using long division, 4 digits at a time.
' When adding (or subtracting), do not carry; instead,
' process these at the end.
DENOM = 3: FIRSTWORD = 1: LASTWORD = 2: SIGN = -1
SUM(1) = 3: TERM(1) = 3: SUM(2) = 2000: TERM(2) = 2000
CLS
DO UNTIL FIRSTWORD >= WORDS
R1 = 0: R2 = 0
FOR I = FIRSTWORD TO LASTWORD + 1
TEMP = TERM(I)
DIVIDEND = R1 * 10000 + TEMP
TEMP = DIVIDEND \ 25&
R1 = DIVIDEND - TEMP * 25&
TERM(I) = TEMP
DIVIDEND = R2 * 10000 + TEMP
TEMP = DIVIDEND \ DENOM
R2 = DIVIDEND - TEMP * DENOM
SUM(I) = SUM(I) + SIGN * TEMP
NEXT
FOR I = LASTWORD + 2 TO WORDS
DIVIDEND = R2 * 10000
TEMP = DIVIDEND \ DENOM
R2 = DIVIDEND - TEMP * DENOM
SUM(I) = SUM(I) + SIGN * TEMP
NEXT
DENOM = DENOM + 2
SIGN = -SIGN
IF TERM(LASTWORD + 1) > 0 AND LASTWORD < WORDS THEN LASTWORD = LASTWORD + 1
IF TERM(FIRSTWORD) = 0 THEN FIRSTWORD = FIRSTWORD + 1
LOOP
DENOM = 3: FIRSTWORD = 2: R1 = 4
FOR I = 2 TO WORDS
DIVIDEND = R1 * 10000
TERM(I) = DIVIDEND \ 239&
R1 = DIVIDEND - TERM(I) * 239&
SUM(I) = SUM(I) - TERM(I)
NEXT
DO UNTIL FIRSTWORD >= WORDS
R1 = TERM(FIRSTWORD)
R2 = 0: R3 = 0: R4 = 0
FIRSTWORD = FIRSTWORD + 1
FOR I = FIRSTWORD TO WORDS
TEMP = TERM(I)
DIVIDEND = R1 * 10000 + TEMP
TEMP = DIVIDEND \ 57121 ' 239 squared
R1 = DIVIDEND - TEMP * 57121
DIVIDEND = R2 * 10000 + TEMP
TEMP2 = DIVIDEND \ DENOM
R2 = DIVIDEND - TEMP2 * DENOM
SUM(I) = SUM(I) + TEMP2
DIVIDEND = R3 * 10000 + TEMP
TEMP = DIVIDEND \ 57121
R3 = DIVIDEND - TEMP * 57121
DIVIDEND = R4 * 10000 + TEMP
TEMP2 = DIVIDEND \ (DENOM + 2)
R4 = DIVIDEND - TEMP2 * (DENOM + 2)
SUM(I) = SUM(I) - TEMP2
TERM(I) = TEMP
NEXT
FIRSTWORD = FIRSTWORD + 1
IF TERM(FIRSTWORD) = 0 THEN FIRSTWORD = FIRSTWORD + 1
DENOM = DENOM + 4
LOOP
FOR I = WORDS TO 2 STEP -1
IF SUM(I) < 0 THEN
TEMP = SUM(I) \ 10000
SUM(I) = SUM(I) - (TEMP - 1) * 10000
SUM(I - 1) = SUM(I - 1) + TEMP - 1
ELSEIF SUM(I) >= 10000 THEN
TEMP = SUM(I) \ 10000
SUM(I) = SUM(I) - TEMP * 10000
SUM(I - 1) = SUM(I - 1) + TEMP
END IF
NEXT
PRINT "3.",
FOR I = 2 TO WORDS
PRINT RIGHT$("0000" + LTRIM$(STR$(SUM(I))), 4),
NEXT
|