home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol217 / mathlib.cmd < prev    next >
OS/2 REXX Batch file  |  1986-02-12  |  11KB  |  295 lines

  1. * <<<=======================================================================>>>
  2. *     This program is Copyrighted and the Sole Property of Keith R. Plossl
  3. *            Program Name    : MATHLIB.CMD
  4. *            Author        : Keith R. Plossl
  5. *            Date Written    : February 1984
  6. *
  7. *  <++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
  8. *  <           C O P Y R I G H T E D   S O F T W A R E   N O T I C E        >
  9. *  <           =====================================================        >
  10. *  <  This software is copyrighted under the laws of the United States of   >
  11. *  <  America and all rights are reserved by Keith R. Plossl.  This program >
  12. *  <  may be freely copied for non-commercial use provided the title block, >
  13. *  <  modification history and this notice remain intact.  Copying this     >
  14. *  <  program for Resale or for any other commercial purpose is STRICTLY    >
  15. *  <  FORBIDDEN and subject to federal prosecution.       KRP 2/5/84        >
  16. *  <++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
  17. *
  18. *                 M O D I F I C A T I O N    H I S T O R Y
  19. *
  20. *      Date            What                Who
  21. *
  22. * <<<=======================================================================>>>
  23. *
  24. * This program is a mathematics function library for DBASE II.  This file
  25. * will need to have the function called by a name to execute the case.
  26. * Load the three character function code in a variable called FUNCTION.
  27. * Load the parameters as required by the function needed and say: DO MATHLIB
  28. *
  29. *                  >>>> ----- W A R N I N G ----- <<<<
  30. *
  31. *  THE FOLLOWING IS LIST OF VARIABLES USED BY THIS LIBRARY.  CONSIDER THEM
  32. *  TO BE RESERVED WORDS OR YOUR VARIABLES WITH THE SAME NAME WILL BE GONE.
  33. *
  34. *         A             PASS    
  35. *        ABSX                POWRX   
  36. *        ATNX                RADIANS 
  37. *        COSX                RD      
  38. *        CSX            RNDX            
  39. *        DELTA               SEED    
  40. *        EXPO                SEPX    
  41. *        EXPX                SINX    
  42. *        FACT                SLOGX   
  43. *        LOGX                SNX
  44. *        LOGO                SQRD    
  45. *        NUMBER              SQRX    
  46. *           NX                  TANX    
  47. *
  48. do case
  49. * <<<=======================================================================>>>
  50. *
  51. *          ----- >>> Absolute Value Function <<< -----
  52. *     -----------------------------------------------------------
  53. *     | Function Call: ABS             Input Parameters: NUMBER |
  54. *     |                    Output Variable: ABSX   |
  55. *     -----------------------------------------------------------
  56. *
  57.     case !(FUNCTION) = 'ABS' .AND. TYPE(NUMBER) <> 'U'
  58.         if NUMBER < 0
  59.             store -1*NUMBER     to ABSX
  60.         endif
  61.         release NUMBER
  62. * <<<=======================================================================>>>
  63. *
  64. *          ----- >>> Random Number Function <<< -----
  65. *     -----------------------------------------------------------
  66. *     | Function Call: RND             Input Parameters: SEED   |
  67. *     |    Default Seed = .375            Output Variable: RNDX   |
  68. *     -----------------------------------------------------------
  69. *
  70.     case !(FUNCTION) =  'RND' .AND. TYPE(SEED) <> 'U'
  71.         if SEED <= 0 .OR. SEED >= 1
  72.             store .375 to SEED
  73.         endif
  74.         store (SEED*9821+.211327)-int(SEED*9821+.211327) to SEED
  75.         store SEED to RNDX
  76. * <<<=======================================================================>>>
  77. *
  78. *           ----- >>> Square Root Function <<< -----
  79. *     -----------------------------------------------------------
  80. *     | Function Call: SQR             Input Parameters: NUMBER |
  81. *     |                    Output Variable: SQRX   |
  82. *     -----------------------------------------------------------
  83. *
  84.     case !(FUNCTION) = 'SQR' .AND. TYPE(NUMBER) <> 'U'
  85.         if NUMBER < 0
  86.             store -1*NUMBER     to NUMBER
  87.         endif
  88.         store 1 to A, SQRX
  89.         store F  to SQRD
  90.         do while .not. SQRD
  91.             store .5*(A + NUMBER/A) to SQRX
  92.             store SQRX-A  to DELTA
  93.             if DELTA < 0
  94.                 store -1*DELTA to DELTA
  95.             endif
  96.             if DELTA < .000001
  97.                 store T  to SQRD
  98.             else
  99.                 store SQRX to A
  100.             endif
  101.         enddo
  102.         release NUMBER, A, SQRD, DELTA
  103.  
  104. * <<<=======================================================================>>>
  105. *
  106. *         ----- >>> Normal Probability Function <<< -----
  107. *
  108. *     It computes the area under the normal curve such that a number
  109. *     of zero yields a 50% or .5000 area.
  110. *     -----------------------------------------------------------
  111. *     | Function Call: PRB             Input Parameters: NUMBER |
  112. *     |                    Output Variable: PRBX   |
  113. *     -----------------------------------------------------------
  114. *
  115.     case !(FUNCTION) = 'PRB' .AND. TYPE(NUMBER) <> 'U'
  116.         store F to FLG
  117.         if NUMBER < 0
  118.             store T to FLG
  119.             store -1*NUMBER     to NUMBER
  120.         endif
  121.         if NUMBER < 3.08 .and. NUMBER > -3.08
  122.             store .436184 to A
  123.             store -.120168 to B
  124.             store .937298 to C
  125.             store .398942 to D2
  126.             store -1.000000*NUMBER*NUMBER/2.000000 to D1
  127.             store D1 to NX, POWRX
  128.             store 1.000000+NX to EXPX
  129.             store 1.000000 to DELTA, FACT, PASS
  130.             do while PASS < 14
  131.                 store PASS + 1 to PASS
  132.                 store PASS*FACT to FACT
  133.                 store POWRX*NX to POWRX
  134.                 store EXPX to EXPO
  135.                 store EXPX+POWRX/FACT to EXPX
  136.             enddo
  137.             store EXPX to DX
  138.             store DX * D2 to DX
  139.             release NX, EXPO, EXPX, DELTA, POWRX, FACT, PASS
  140.             store 1.000000/(1.000000 + .3326 * NUMBER) to EX
  141.             store 1.00 - DX * (A*EX + B*EX*EX + C*EX*EX*EX) to PRBX
  142.             store str(PRBX,6,4) to SEPX
  143.             store &SEPX to PRBX
  144.         else
  145.             store .999999 to PRBX
  146.         endif
  147.         if FLG
  148.             store 1.00 - PRBX to PRBX
  149.         endif
  150.         release A, B, C, D1, D2, DX, EX, FLG, NUMBER, SEPX
  151.  
  152. * <<<=======================================================================>>>
  153. *
  154. *    ----- >>> Exponential Function (e to X power) <<< -----
  155. *     -----------------------------------------------------------
  156. *     | Function Call: EXP             Input Parameters: NUMBER |
  157. *     |                    Output Variable: EXPX   |
  158. *     -----------------------------------------------------------
  159. *
  160.     case !(FUNCTION) = 'EXP' .AND. TYPE(NUMBER) <> 'U'
  161.         store NUMBER to NX, POWRX
  162.         store 1+NX to EXPX
  163.         store 1 to DELTA, FACT, PASS
  164.         do while DELTA > .0001
  165.             store PASS + 1 to PASS
  166.             store PASS*FACT to FACT
  167.             store POWRX*NX to POWRX
  168.             store EXPX to EXPO
  169.             store EXPX+POWRX/FACT to EXPX
  170.             store EXPX-EXPO to DELTA
  171.         enddo
  172.         store STR(EXPX,12,4) to SEPX
  173.         store &SEPX to EXPX
  174.         release NUMBER, NX, EXPO, DELTA, POWRX, FACT, SEPX, PASS
  175. * <<<=======================================================================>>>
  176. *
  177. *           ----- >>> Radians Function <<< -----
  178. *     -----------------------------------------------------------
  179. *     | Function Call: RAD             Input Parameters: DEGREES|
  180. *     |                    Output Variable: RADIANS|
  181. *     -----------------------------------------------------------
  182. *
  183.     case !(FUNCTION) = 'RAD' .and. type(DEGREES) <> 'U'
  184.         store DEGREES*3.1415962/180.000000 to RADIANS
  185.         release DEGREES
  186. *
  187. * <<<=======================================================================>>>
  188. *
  189. *           ----- >>> Sine Function <<< -----
  190. *     -----------------------------------------------------------
  191. *     | Function Call: SIN             Input Parameters: RADIANS|
  192. *     |                    Output Variable: SINX   |
  193. *     -----------------------------------------------------------
  194. *
  195.     case !(FUNCTION) = 'SIN' .AND. TYPE(RADIANS) <> 'U'
  196.         store RADIANS    to RD
  197.         store RD-RD*RD*RD/6+RD*RD*RD*RD*RD/120-RD*RD*RD*RD*RD*RD*RD/5040 to SINX
  198.         store SINX+RD*RD*RD*RD*RD*RD*RD*RD*RD/362880 to SINX
  199.         release RADIANS, RD
  200. * <<<=======================================================================>>>
  201. *
  202. *          ----- >>> Cosine Function <<< -----
  203. *     -----------------------------------------------------------
  204. *     | Function Call: COS             Input Parameters: RADIANS|
  205. *     |                    Output Variable: COSX   |
  206. *     -----------------------------------------------------------
  207. *
  208.     case !(FUNCTION) = 'COS' .AND. TYPE(RADIANS) <> 'U'
  209.         store RADIANS    to RD
  210.         store 1-RD*RD/2+RD*RD*RD*RD/24-RD*RD*RD*RD*RD*RD/720 to COSX
  211.         store COSX+RD*RD*RD*RD*RD*RD*RD*RD/40320 to COSX
  212.         store COSX-RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/3628800 to COSX
  213.         release RADIANS, RD
  214. * <<<=======================================================================>>>
  215. *
  216. *         ----- >>> Tangent Function <<< -----
  217. *     -----------------------------------------------------------
  218. *     | Function Call: TAN             Input Parameters: RADIANS|
  219. *     |                    Output Variable: TANX   |
  220. *     -----------------------------------------------------------
  221. *
  222.     case !(FUNCTION) = 'TAN' .AND. TYPE(RADIANS) <> 'U'
  223.         store RADIANS to RD
  224.         store RD-RD*RD*RD/6+RD*RD*RD*RD*RD/120-RD*RD*RD*RD*RD*RD*RD/5040 to SNX
  225.         store SNX+RD*RD*RD*RD*RD*RD*RD*RD*RD/362880 to SNX
  226.         store 1-RD*RD/2+RD*RD*RD*RD/24-RD*RD*RD*RD*RD*RD/720 to CSX
  227.         store CSX+RD*RD*RD*RD*RD*RD*RD*RD/40320 to CSX
  228.         store CSX-RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/3628800 to CSX
  229.         store SNX/CSX to TANX
  230.         release RADIANS, RD, SNX, CSX
  231.         
  232. * <<<=======================================================================>>>
  233. *
  234. *         ----- >>> Arc Tangent Function <<< -----
  235. *     -----------------------------------------------------------
  236. *     | Function Call: ATN             Input Parameters: NUMBER |
  237. *     |                    Output Variable: ATNX   |
  238. *     -----------------------------------------------------------
  239. *
  240.     case !(FUNCTION) = 'ATN' .AND. TYPE(NUMBER) <> 'U'
  241.         store NUMBER to NX
  242.         if NX*NX < 1
  243.             store NX-NX*NX*NX/3+NX*NX*NX*NX*NX/5-NX*NX*NX*NX*NX*NX*NX/7 to ATNX
  244.             store ATNX+NX*NX*NX*NX*NX*NX*NX*NX*NX/9 to ATNX
  245.         else
  246.             store 1.5707963-1/NX+1/(3*NX*NX*NX)-1/(5*NX*NX*NX*NX*NX) to ATNX
  247.             store ATNX+1/(7*NX*NX*NX*NX*NX*NX*NX)-1/(9*NX*NX*NX*NX*NX*NX*NX*NX*NX) to ATNX
  248.         endif
  249.         release NUMBER, NX
  250.  
  251. * <<<=======================================================================>>>
  252. *
  253. *       ----- >>> Natural (Naperian) Logarithm <<< -----
  254. *     -----------------------------------------------------------
  255. *     | Function Call: LNX             Input Parameters: NUMBER |
  256. *     |                    Output Variable: LOGX   |
  257. *     -----------------------------------------------------------
  258. *
  259.     case !(FUNCTION) = 'LNX' .AND. TYPE(NUMBER) <> 'U'
  260.         store (NUMBER-1.000000)/(NUMBER+1.000000) to NX, POWRX, LOGX
  261.         store 1 to DELTA, PASS
  262.         do while DELTA > .001
  263.             store PASS + 2 to PASS
  264.             store POWRX*NX*NX to POWRX
  265.             store LOGX  to LOGO
  266.             store LOGX+POWRX/PASS to LOGX
  267.             store LOGX-LOGO to DELTA
  268.         enddo
  269.         store 2.00*LOGX to LOGX
  270.         store STR(LOGX,12,4) to SLOGX
  271.         store &SLOGX to LOGX
  272.         release NUMBER, NX, LOGO, DELTA, POWRX, PASS, SLOGX
  273. * <<<=======================================================================>>>
  274. *
  275. *        ----- >>>  Otherwise Undefined <<< -----
  276. *
  277.     otherwise
  278.         store 'UNKNOWN' to FUNCTION
  279.         
  280. endcase
  281. if FUNCTION <> 'UNKNOWN'
  282.     release FUNCTION
  283. endif
  284. return
  285. * <<<=======================================================================>>>
  286. *
  287. *           End of DBASE II  Mathematical Function Library
  288. *
  289. * <<<=======================================================================>>>
  290. *     This program is Copyrighted and the Sole Property of Keith R. Plossl
  291. * <<<=======================================================================>>>
  292. *
  293.  
  294.