PROC pi: GLOBAL ptrsum%, ptrterm%, words%, first%, last%, denom& LOCAL digits&, rem&, x%, dvdnd&, quot& dINIT dLONG digits&, "How many digits", 1, 9999 IF DIALOG = 0 STOP ENDIF words% = INT( digits& / 4 ) + 3 ptrsum% = ALLOC( 4 * ( words% + 1 ) ) IF ptrsum% = 0 PRINT "Not enough memory" STOP ENDIF ptrterm% = ALLOC( 2 * ( words% + 1 ) ) IF ptrterm% = 0 PRINT "Not enough memory" FREEALLOC ptrsum% STOP ENDIF x% = 1 WHILE x% <= words% + 1 psum:( x%, &0 ) pterm:( x%, &0 ) x% = x% + 1 ENDWH denom& = 3 :first% = 1 :last% = 2 psum:( 1, &3 ) pterm:( 1, &3 ) psum:( 2, INT( 2000 ) ) pterm:( 2, INT( 2000 ) ) WHILE first% < words% atan5: denom& = denom& + 2 ENDWH denom& = 3 :first% = 2 :rem& = 4 x% = 2 WHILE x% <= words% dvdnd& = rem& * 10000 pterm:( x%, INT( dvdnd& / 239 ) ) rem& = dvdnd& - gterm&:( x% ) * 239 psum:( x%, gsum&:( x% ) - gterm&:( x% ) ) x% = x% + 1 ENDWH WHILE first% < words% atan239: denom& = denom& + 4 ENDWH x% = words% WHILE x% >= 2 IF gsum&:( x% ) < 0 quot& = INT( gsum&:( x% ) / 10000 ) psum:( x%, gsum&:( x% ) - ( quot& - 1 ) * 10000 ) psum:( x% - 1, gsum&:( x% - 1 ) + quot& - 1 ) ENDIF IF gsum&:( x% ) >= 10000 quot& = INT( gsum&:( x% ) / 10000 ) psum:( x%, gsum&:( x% ) - quot& * 10000 ) psum:( x% - 1, gsum&:( x% - 1 ) + quot& ) ENDIF x% = x% - 1 ENDWH PRINT "pi = 3+." x% = 1 WHILE x% <= INT( words% / 3 ) PRINT " "; PRINT RIGHT$( "0000" + GEN$( gsum&:( 3 * ( x% - 1 ) + 2 ), 9 ), 4 ); PRINT RIGHT$( "0000" + GEN$( gsum&:( 3 * ( x% - 1 ) + 3 ), 9 ), 4 ); PRINT RIGHT$( "0000" + GEN$( gsum&:( 3 * ( x% - 1 ) + 4 ), 9 ), 4 ); IF x% - 4 * INT( x% / 4 ) = 0 PRINT " :";12 * x% ENDIF x% = x% + 1 ENDWH PRINT PRINT "Done" GET ENDP PROC atan5: LOCAL x%, temp&, rem1&, rem2&, dvdnd& x% = first% WHILE x% <= last% + 1 temp& = gterm&:( x% ) dvdnd& = rem1& * 10000 + temp& temp& = INT( dvdnd& / 25 ) rem1& = dvdnd& - temp& * 25 pterm:( x%, temp& ) dvdnd& = rem2& * 10000 + temp& temp& = INT( dvdnd& / denom& ) rem2& = dvdnd& - temp& * denom& psum:( x%, gsum&:( x% ) - temp& ) x% = x% + 1 ENDWH x% = last% + 2 WHILE x% <= words% dvdnd& = rem2& * 10000 temp& = INT( dvdnd& / denom& ) rem2& = dvdnd& - temp& * denom& psum:( x%, gsum&:( x% ) - temp& ) x% = x% + 1 ENDWH IF gterm&:( last% + 1 ) > 0 AND last% < words% last% = last% + 1 ENDIF IF gterm&:( first% ) = 0 first% = first% + 1 ENDIF denom& = denom& + 2 rem1& = 0 rem2& = 0 x% = first% WHILE x% <= last% + 1 temp& = gterm&:( x% ) dvdnd& = rem1& * 10000 + temp& temp& = INT( dvdnd& / 25 ) rem1& = dvdnd& - temp& * 25 pterm:( x%, temp& ) dvdnd& = rem2& * 10000 + temp& temp& = INT( dvdnd& / denom& ) rem2& = dvdnd& - temp& * denom& psum:( x%, gsum&:( x% ) + temp& ) x% = x% + 1 ENDWH x% = last% + 2 WHILE x% <= words% dvdnd& = rem2& * 10000 temp& = INT( dvdnd& / denom& ) rem2& = dvdnd& - temp& * denom& psum:( x%, gsum&:( x% ) + temp& ) x% = x% + 1 ENDWH IF gterm&:( last% + 1 ) > 0 AND last% < words% last% = last% + 1 ENDIF IF gterm&:( first% ) = 0 first% = first% + 1 ENDIF ENDP PROC atan239: LOCAL x%, d2&, rem1&, rem2&, rem3&, rem4&, dvdnd&, temp&, temp2& rem1& = gterm&:( first% ) rem2& = 0 rem3& = 0 rem4& = 0 d2& = denom& + 2 first% = first% + 1 x% = first% WHILE x% <= words% temp& = gterm&:( x% ) dvdnd& = rem1& * 10000 + temp& temp& = INT( dvdnd& / 57121 ) rem1& = dvdnd& - temp& * 57121 dvdnd& = rem2& * 10000 + temp& temp2& = INT( dvdnd& / denom& ) rem2& = dvdnd& - temp2& * denom& psum:( x%, gsum&:( x% ) + temp2& ) dvdnd& = rem3& * 10000 + temp& temp& = INT( dvdnd& / 57121 ) rem3& = dvdnd& - temp& * 57121 dvdnd& = rem4& * 10000 + temp& temp2& = INT( dvdnd& / d2& ) rem4& = dvdnd& - temp2& * d2& psum:( x%, gsum&:( x% ) - temp2& ) pterm:( x%, temp& ) x% = x% + 1 ENDWH first% = first% + 1 IF gterm&:( first% ) = 0 first% = first% + 1 ENDIF ENDP PROC psum:( idx%, v& ) POKEL UADD( ptrsum%, ( idx% - 1 ) * 4 ), v& ENDP PROC gsum&:( idx% ) RETURN PEEKL( UADD( ptrsum%, ( idx% - 1 ) * 4 ) ) ENDP PROC pterm:( idx%, v& ) POKEW UADD( ptrterm%, ( idx% - 1 ) * 2 ), v& ENDP PROC gterm&:( idx% ) RETURN PEEKW( UADD( ptrterm%, ( idx% - 1 ) * 2 ) ) ENDP