The QBasic Forum      Other Subforums, Links and Downloads
 
 Return to Index  

Pi calculation

March 15 2009 at 10:10 AM
qbguy  (no login)

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




 
 Respond to this message   

Newbies usually go to www.qbasic.com and click on The QBasic Forum
Forum regulars have their own ways, which include The QBasic Community Forums