home *** CD-ROM | disk | FTP | other *** search
- ~~TBASIC~~
- '--------------------------------------------------------------
- ' TableCurve Turbo BASIC Library Module
- '--------------------------------------------------------------
- ' This code is specific to Borland Turbo BASIC. The ON ERROR
- ' approach is BASIC's standard error-handling and this is
- ' included in the code. It was not, however, 100% successful
- ' in catching exceptions in system math functions.
- ' Turbo BASIC will also compile successfully without
- ' modification the code generated for BASICA/GWBASIC.
- '--------------------------------------------------------------
- DEFDBL x,y
- DEFINT i,j
- DIM x(17),y(17)
-
- ' Get screen attribute for reset at end of program
- attr0%=FNgetattr%
- fore0%=attr0% MOD 16
- back0%=attr0% \ 16
-
- ' Determine whether to use color or monochrome attributes
- iscolor=FNgetcolor%
- IF iscolor THEN
- fore1%=1 : back1%=7 : fore2%=15 : back2%=1
- ELSE
- fore1%=15 : back1%=0 : fore2%=0 : back2%=7
- END IF
-
- ' Main Window is Full Screen, Key Display is Off
- KEY OFF
- COLOR fore1%,back1%,back1% : CLS
- LOCATE 1,2 : PRINT CHR$(201);
- LOCATE 25,2 : PRINT CHR$(200);
- LOCATE 1,79 : PRINT CHR$(187);
- LOCATE 25,79 : PRINT CHR$(188);
- FOR I=3 TO 78 : LOCATE 1,I : PRINT CHR$(205); : NEXT I
- FOR I=3 TO 78 : LOCATE 25,I : PRINT CHR$(205); : NEXT I
- FOR I=2 TO 24 : LOCATE I,2 : PRINT CHR$(186); : NEXT I
- FOR I=2 TO 24 : LOCATE I,79 : PRINT CHR$(186); : NEXT I
- LOCATE 1,`POSN1`
- PRINT " TableCurve Function: `FILE` `DATE` `TIME` ";
-
- ' X-Y Data Window
- COLOR fore2%,back2%,back2%
- FOR I=5 TO 23 : LOCATE I,33 : PRINT SPACE$(45); : NEXT I
- LOCATE 5,33 : PRINT CHR$(218);
- LOCATE 24,33 : PRINT CHR$(192);
- LOCATE 5,77 : PRINT CHR$(191);
- LOCATE 24,77 : PRINT CHR$(217);
- FOR I=34 TO 76 : LOCATE 5,I : PRINT CHR$(196); : NEXT I
- FOR I=34 TO 76 : LOCATE 24,I : PRINT CHR$(196); : NEXT I
- FOR I=6 TO 23 : LOCATE I,33 : PRINT CHR$(179); : NEXT I
- FOR I=6 TO 23 : LOCATE I,77 : PRINT CHR$(179); : NEXT I
- LOCATE 5,`POSN2` : PRINT " `TITLE` ";
- LOCATE 6,35 : PRINT "`XTITLE`";
- LOCATE 6,57 : PRINT "`YTITLE`";
-
- ' Equation Data and Input Setup
- COLOR fore1%,back1%,back1%
- LOCATE 3,4 : PRINT "`EQSTR`";
- LOCATE 4,6 : PRINT "Eqn# `EQNO`";
- LOCATE 5,6 : PRINT "r2=`R2VAL`";
- LOCATE 6,6 : PRINT "a= `ASTR`";
- LOCATE 7,6 : PRINT "b= `BSTR`";
- LOCATE 8,6 : PRINT "c= `CSTR`";
- LOCATE 9,6 : PRINT "d= `DSTR`";
- LOCATE 10,6 : PRINT "e= `ESTR`";
- LOCATE 11,6 : PRINT "f= `FSTR`";
- LOCATE 12,6 : PRINT "g= `GSTR`";
- LOCATE 13,6 : PRINT "h= `HSTR`";
- LOCATE 14,6 : PRINT "i= `ISTR`";
- LOCATE 15,6 : PRINT "j= `JSTR`";
- LOCATE 16,6 : PRINT "k= `KSTR`";
- LOCATE 18,4 : PRINT "X= `XTITLE`";
- LOCATE 19,4 : PRINT "Y= `YTITLE`";
- LOCATE 21,4 : PRINT "Enter Value [x=,y=]";
- LOCATE 24,4 : PRINT "Press ESC to End Program";
-
- ' Data Input Loop, Exits only by ESCAPE
- irow=7
- iflag=1
- idir=0
- iatmax=0
- ON ERROR GOTO MathError
- WHILE iflag
- LoopStart:
- j=irow-6
- COLOR fore2%,back2%,back2%
- IF idir=1 THEN idir=0 ELSE idir=1
- xold=x(j)
- x(j)=FNnumfld#(22,4,25)
- IF istatus=0 THEN
- COLOR fore0%,back0%,back0%
- CLS
- SYSTEM
- ELSEIF istatus>0 THEN
- y(j)=FN`FNAME`#(x(j))
- ELSE
- y(j)=x(j)
- x(j)=FNrtbis#(y(j),idir)
- END IF
- IF irow=23 THEN LOCATE 23,34 : PRINT SPACE$(42);
- LOCATE irow,35
- fmt$="########.########"
- IF ABS(x(j))>1.0E+07 OR ABS(x(j))<1.0E-04 THEN fmt$=" +#.#######^^^^"
- PRINT USING fmt$;x(j);
- LOCATE irow,57
- fmt$="########.########"
- IF ABS(y(j))>1.0E+07 OR ABS(y(j))<1.0E-04 THEN fmt$=" +#.#######^^^^"
- PRINT USING fmt$;y(j);
- irow=irow+1
- IF irow>23 THEN irow=23 : iatmax=1
- COLOR fore1%,back1%,back1%
- WEND
- MathError:
- RESUME LoopStart
- END
-
- '---------------------------------------------------------------
- DEF FNgetattr%
- '---------------------------------------------------------------
- 'gets current screen attribute
- REG 1, 8*256
- REG 2, 0
- CALL INTERRUPT &H10
- FNgetattr%= REG(1) \ 256
- END DEF
-
- '---------------------------------------------------------------
- DEF FNgetcolor%
- '---------------------------------------------------------------
- 'returns 1 for color display, 0 for monochrome
- LOCAL ral%
- REG 1, 15*256
- CALL INTERRUPT &H10
- ral%=REG(1) MOD 256
- FNgetcolor%=1
- IF ((ral%=0) or (ral%=2) or (ral%=7)) THEN FNgetcolor%=0
- END DEF
-
- '---------------------------------------------------------------
- DEF FNnumfld# (rowfld%,colfld%,maxlen%)
- '---------------------------------------------------------------
- 'returns double precision numeric input
- 'status contains number of characters input, 0 on ESC
- LOCAL c%,ichar%,nfld$,notdone%
- SHARED istatus%
- LOCATE rowfld%,colfld%,1: PRINT SPACE$(maxlen%);
- LOCATE rowfld%,colfld%,1
- ichar%=0 : iyflag%=0 : iexp=0
- notdone%=1
- WHILE notdone% AND ichar%<maxlen%
- c%=ASC(INPUT$(1))
- ipass%=0
- IF ichar%=0 AND (c%=89 OR c%=121) THEN
- iyflag%=1
- ipass=1
- ELSEIF (ichar%=0 AND (c%=88 OR c%=120)) OR (ichar%=1 AND c%=61) THEN
- ipass%=1
- END IF
- IF (c%>=48 AND c%<=57) OR c%=45 OR c%=43 OR c%=46 OR_
- ((c%=69 OR c%=101) AND iexp%=0) OR ipass%=1 THEN
- IF ipass%=0 THEN nfld$=nfld$+CHR$(c%)
- IF c%=69 OR c%=101 THEN iexp%=1
- LOCATE rowfld%,colfld%+ichar%,1: PRINT CHR$(c%);
- LOCATE rowfld%,colfld%+ichar%+1,1
- ichar%=ichar%+1
- ELSEIF (c%=10 OR c%=13 OR ichar%=maxlen%) AND ichar%>0 THEN
- notdone%=0
- ELSEIF c%=8 AND ichar%>0 THEN
- ichar%=ichar%-1
- IF ichar%=0 THEN iyflag%=0
- LOCATE rowfld%,colfld%+ichar%,1: PRINT CHR$(32);
- IF len(nfld$)>0 THEN nfld$=LEFT$(nfld$,LEN(nfld$)-1)
- LOCATE rowfld%,colfld%+ichar%,1:
- ELSEIF c%=27 THEN
- ichar%=0
- notdone%=0
- END IF
- WEND
- IF iyflag%=0 THEN istatus%=ichar% ELSE istatus%=-ichar%
- FNnumfld#=0
- IF istatus%<>0 THEN FNnumfld#=VAL(nfld$)
- endfn:
- END DEF
-
- '---------------------------------------------------------------
- DEF FNrtbis# (y#,dir%)
- '---------------------------------------------------------------
- 'root bisection routine
- 'dir%=0 starts at lowest partition, =1 at highest
- 'last chance is partition from XatYmin to XatYmax
- 'returns 0 upon failure to find root
- LOCAL x1#,x2#,xinc#,dx#,f#,fmid#,xmid#,rtb#,xacc#
- LOCAL i%,j%
- xacc#=1E-6*`XMEAN`
- xinc#=`XRANGE`/4.0
- FOR i%=0 TO 4
- IF i%=4 THEN
- x1#=`XATYMIN`
- x2#=`XATYMAX`
- ELSEIF dir%=1 THEN
- x2#=`XMAXIMUM`-xinc#*i%
- x1#=`XMAXIMUM`-xinc#*(i%+1)
- ELSE
- x1#=`XMINIMUM`+xinc#*i%
- x2#=`XMINIMUM`+xinc#*(i%+1)
- END IF
- f#=y#-FN`FNAME`(x1#)
- fmid#=y#-FN`FNAME`(x2#)
- IF f#*fmid#<0 THEN
- IF f#<0.0 THEN
- dx#=x2#-x1#
- rtb#=x1#
- ELSE
- dx#=x1#-x2#
- rtb#=x2#
- END IF
- FOR j%=1 TO 100
- dx#=dx#*0.5
- xmid#=rtb#+dx#
- fmid#=y#-FN`FNAME`(xmid#)
- IF fmid#<=0 THEN rtb#=xmid#
- IF ABS(dx#)<xacc# OR fmid#=0 THEN FNrtbis#=rtb# : GOTO done
- NEXT j%
- END IF
- NEXT i%
- FNrtbis#=0.0
- done:
- END DEF
-
- !!TBASIC!!
- '---------------------------------------------------------------`ERF`
- DEF FNERF#(X#)`ERF`
- '---------------------------------------------------------------`ERF`
- LOCAL t,z,ans`ERF`
- z=ABS(X#)`ERF`
- t=1.0/(1.0+0.5*z)`ERF`
- ans=(t*EXP(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+_`ERF`
- t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+_`ERF`
- t*(1.48851587+t*(-0.82215223+t*0.17087277))))))))))`ERF`
- IF x>=0.0 THEN FNERF#=1.0-ans ELSE FNERF#=-1.0+ans`ERF`
- END DEF`ERF`
-
- '---------------------------------------------------------------
- DEF FN`FNAME`#(X#)
- '---------------------------------------------------------------
- ' TableCurve Function:`FILE` `DATE` `TIME`
- ' `TITLE`
- ' X= `XTITLE`
- ' Y= `YTITLE`
- ' Eqn# `EQNO` `EQSTR`
- ' r2=`R2VAL`
- ' r2adj=`R2ADJ`
- ' StdErr=`STDERR`
- ' Fval=`FVAL`
- ' a= `ASTR`
- ' b= `BSTR`
- ' c= `CSTR`
- ' d= `DSTR`
- ' e= `ESTR`
- ' f= `FSTR`
- ' g= `GSTR`
- ' h= `HSTR`
- ' i= `ISTR`
- ' j= `JSTR`
- ' k= `KSTR`
- '---------------------------------------------------------------
- LOCAL Y#
- LOCAL N#`FDECLN`
- LOCAL `FLIST`
- X#=`FX`
- N#=`FBAL2`
- N#=`FAUX`
- X1#=`F1`
- X2#=`F2`
- X3#=`F3`
- X4#=`F4`
- Y#=`EQNCODE`
- FN`FNAME`#=`FY`
- END DEF
- !!TBASIC!!
- ~~TBASIC~~
-