home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug060.arc / CPM#006.LBR / MATHLIB.CMD < prev    next >
OS/2 REXX Batch file  |  1979-12-31  |  14KB  |  380 lines

  1. * <<<===============================================================>>>
  2. * This program is a mathematics function library for dBASE II.    This
  3. * file will need to have the function called by a name to exectute the
  4. * case.  Load the three charcter function code in a variable called
  5. * FUNCTION.  Load the parameters as required by the function needed and
  6. * say :  DO MATHLIB
  7. *                E X A M P L E
  8. *             ===================
  9. *             store 'SQR' to FUNCTION
  10. *             store (your value) to NUMBER
  11. *             DO MATHLIB
  12. * <<<=================================================================>>>
  13. *            <<< W A R N I N G >>>
  14. * The following is a list of variables used by this library.  Consider
  15. * them to be reserved words or your variables with the same name will
  16. * be gone.
  17. *
  18. *    A    PASS
  19. *    ABSX    POWRX
  20. *    ATNX    RADIANS
  21. *    COSX    RD
  22. *    CSX    RNDX
  23. *    D
  24. *    DEGREES S
  25. *    DELTA    SEED
  26. *    DMS
  27. *    EXPO    SEPX
  28. *    EXPX    SINX
  29. *    FACT    SLOGX
  30. *    LOGX    SNX
  31. *    LOGO    SQRD
  32. *    M
  33. *    MD
  34. *    NUMBER    SQRX
  35. *    NX    TANX
  36. *
  37. *
  38. * <<<================================================================>>>
  39. *  These functions were copied from the October 1984 issue of DATA BASED
  40. *  ADVISOR magazine.  They were written by Keith R. Plossi, Vice 
  41. *  President of George Plossl Educational Services, Inc., of 
  42. *  Atlanta, Georgia.       Bob Williams  Kansas City District COE
  43. *
  44. * <<<=================================================================>>>
  45. *
  46. *          M O D I F I C A T I O N     H I S T O R Y
  47. *          ________________________________________
  48. *
  49. *   DATE--11/30/84
  50. *   AUTHOR--Steven R. Burns    Kansas City District  COE
  51. *   DESCRIPTION--Several functions have been added to enhance the versatility
  52. *   of this library.  The DMS to DEGREES function changes degrees, minutes,
  53. *   and seconds in the format DDD.MMSS to decimal degrees which are used in
  54. *   the Degrees to Radians function.  An incorrect value for PI was published
  55. *   for this function and this has been corrected.  In addition, function
  56. *   routines were written to convert Radians to Degrees and Degrees to degrees,
  57. *   minutes, and seconds (DMS).  Also the SIN, COS, and TAN functions have
  58. *   been expanded to increase their accuracy.  The ATN function has been
  59. *   commented out, however the original code has been left in place along with
  60. *   comments on how to make it more accurate.
  61. *
  62. *
  63. * <<<==================================================================>>>
  64. do case
  65. * <<<==================================================================>>>
  66. *
  67. *           ------>>>> Absolute Value Function <<<<-------
  68. *
  69. *           ------------------------------------------------------
  70. *           |  Function Call: ABS       Input Parameters:  NUMBER |
  71. *           |               Output Variable :  ABSX   |
  72. *           ------------------------------------------------------
  73. *
  74. *
  75. case !(FUNCTION) = 'ABS' .AND. TYPE(NUMBER) <>    'U'
  76.   if NUMBER < 0
  77.      store -1*NUMBER to ABSX
  78. else
  79.     store NUMBER to ABSX
  80.   endif
  81.     release NUMBER
  82. * <<<==================================================================>>>
  83. *
  84. *           ------>>>> Random Number Function <<<<--------
  85. *
  86. *           ------------------------------------------------------
  87. *           |  Function Call: RND       Input Parameters:  SEED  |
  88. *           |  Default Seed = .375       Output Variable :  RNDX  |
  89. *           ------------------------------------------------------
  90. *
  91. case !(FUNCTION) = 'RND' .AND. TYPE(SEED) <> 'U'
  92.   if SEED <= 0 .or. SEED >= 1
  93.      store .375 to SEED
  94.   endif
  95.   store (SEED*9821+.211327)-INT(SEED*9821+.211327) to SEED
  96.   store SEED to RNDX
  97. * <<<==================================================================>>>
  98. *
  99. *          -------->>> Square Root Function <<<---------
  100. *
  101. *           ------------------------------------------------------
  102. *           |  Function Call: SQR       Input Parameters:  NUMBER |
  103. *           |               Output Variable :  SQRX   |
  104. *           ------------------------------------------------------
  105. *
  106. case !(FUNCTION) = 'SQR' .AND. TYPE (NUMBER) <>  'U'
  107.   if NUMBER < 0
  108.       store -1*NUMBER to NUMBER
  109.   endif
  110.   store 1 to A, SQRX
  111.   store F to SQRD
  112.   do while .not. SQRD
  113.      store .5*(A + NUMBER/A) to SQRX
  114.      store SQRX-A to DELTA
  115.     if DELTA < 0 
  116.        store -1*DELTA to DELTA
  117.     endif
  118.     if DELTA < .000001
  119.        store T to SQRD
  120.     else
  121.        store SQRX to A
  122.     endif
  123. enddo
  124. release NUMBER, A, SQRD, DELTA 
  125. * <<<===============================================================>>>
  126. *
  127. *           --------->>> Normal Probability Function <<<--------
  128. *
  129. *
  130. *           It computes the area under the normal curve such that
  131. *           a number of zero yields a 50% or .5000 area.
  132. *
  133. *
  134. *           ------------------------------------------------------
  135. *           |  Function Call: PRB       Input Parameters:  NUMBER |
  136. *           |               Output Variable :  PRBX   |
  137. *           ------------------------------------------------------
  138. *
  139. case !(FUNCTION) = 'PRB' .AND. TYPE(NUMBER) <> 'U'
  140.   store F to FLG
  141.   if NUMBER < 0
  142.      store T to FLG
  143.      store -1*NUMBER to NUMBER
  144.   endif
  145. if NUMBER < 3.08 .and. NUMBER > -3.08
  146.      store  .436184 to A
  147.      store  -.120168 to B
  148.      store  .937298 to C
  149.      store  .398942 to D2
  150.      store  -1.000000* NUMBER*NUMBER/2.000000 to D1
  151.      store D1 to NX, POWRX
  152.      store 1.000000+NX to EXPX
  153.      store 1.000000 to FACT, PASS
  154.      do while PASS < 14
  155.     store PASS + 1 to PASS
  156.     store PASS*FACT to FACT
  157.     store POWRX*NX to POWRX
  158.     store EXPX to EXPO
  159.     store EXPX+POWRX/FACT to EXPX
  160.      enddo
  161.      store EXPX to DX
  162.      store DX * D2 to DX
  163.      release NX, EXPO, EXPX, POWRX, FACT, PASS
  164.      store 1.000000/(1.000000 + .3326 * NUMBER) to  EX
  165.      store 1.00 - DX * (A*EX + B*EX*EX + C*EX*EX*EX) to PRBX
  166.      store str(PRBX,6,4) to SEPX
  167.      store &SEPX to PRBX
  168. else
  169.      store .999999 to PRBX
  170. endif
  171. if FLG
  172.      store 1.00 - PRBX to PRBX
  173. endif
  174. release A, B, C, D1, D2, DX, EX, FLG, NUMBER, SEPX
  175. * <<<=============================================================>>>
  176. *
  177. *     -------->>>> Exponential Function (e to X power) <<<<--------
  178. *
  179. *           ------------------------------------------------------
  180. *           |  Function Call: EXP       Input Parameters:  NUMBER |
  181. *           |               Output Variable :  EXPX   |
  182. *           ------------------------------------------------------
  183. *
  184. case !(FUNCTION) = 'EXP' .AND. TYPE(NUMBER) <> 'U'
  185.   store NUMBER to NX, POWRX
  186.   store 1+NX to EXPX
  187.   store 1 to FACT, PASS
  188. do while PASS < 12
  189.    store PASS + 1 to PASS
  190.    store PASS*FACT to FACT
  191.    store POWRX*NX to POWRX
  192.    store EXPX to EXPO
  193.    store EXPX+POWRX/FACT to EXPX
  194. enddo
  195. store STR(EXPX,12,4) to SEPX
  196. store &SEPX to EXPX
  197. release NUMBER, NX, EXPO, POWRX, FACT, SEPX, PASS
  198. * <<<==================================================================>>>
  199. *
  200. *         ---------->>>> DMS to Degrees Function <<<<--------
  201. *           Format for DMS = DDD.MMSS
  202. *           ------------------------------------------------------
  203. *           |  Function Call: DEC       Input Parameters:  DMS    |
  204. *           |               Output Variable :  DEGREES|
  205. *           ------------------------------------------------------
  206. *
  207. case !(FUNCTION) = 'DEC' .AND. TYPE(DMS)<>'U'
  208.   store INT(DMS) to D
  209.   store (DMS-D)*100 to MD
  210.   store INT(MD) to M
  211.   store (MD-M)*100 to S
  212.   store D/1.000000000 to DEGREES
  213.   store DEGREES +M/60 TO DEGREES
  214.   store DEGREES +S/3600 TO DEGREES
  215.   release D,MD,M,S,DMS
  216. * <<<==================================================================>>>
  217. *
  218. *         ---------->>>> Radians Function <<<<--------
  219. *
  220. *           ------------------------------------------------------
  221. *           |  Function Call: RAD       Input Parameter :  DEGREES|
  222. *           |               Output Variable :  RADIANS|
  223. *           ------------------------------------------------------
  224. *
  225. case !(FUNCTION) = 'RAD' .AND. TYPE(DEGREES) <> 'U'
  226.   store DEGREES*3.141592654/180.000000000 to RADIANS
  227.   release DEGREES
  228. * <<<==================================================================>>>
  229. *
  230. *         ---------->>>> Degrees Function <<<<--------
  231. *
  232. *           ------------------------------------------------------
  233. *           |  Function Call: DEG       Input Parameter :  RADIANS|
  234. *           |               Output Variable :  DEGREES|
  235. *           ------------------------------------------------------
  236. *
  237. case !(FUNCTION) = 'DEG' .AND. TYPE(RADIANS) <> 'U'
  238.   store RADIANS*180.000000000/3.141592654 to DEGREES
  239.   release RADIANS
  240. * <<<==================================================================>>>
  241. *
  242. *         ---------->>>> Degrees to DMS Function <<<<--------
  243. *           Format for DMS = DDD.MMSS
  244. *           ------------------------------------------------------
  245. *           |  Function Call: DMS       Input Parameter :  DEGREES|
  246. *           |               Output Variables:  DMS    |
  247. *           ------------------------------------------------------
  248. *
  249. case !(FUNCTION) = 'DMS' .AND. TYPE(DEGREES) <> 'U'
  250.   store INT(DEGREES) to DMS
  251.   store (DEGREES-DMS)*60 to MD
  252.   store INT(MD) to M
  253.   store (((MD-M)*60)+.0005) to S
  254.   store (INT(1000*(S)))/1000.00000000 to S
  255.   store DMS+M/100+S/10000 to DMS
  256. release DEGREES, MD, M, S
  257. * <<<==================================================================>>>
  258. *
  259. *           ---------->>>> Sine Function <<<<------------
  260. *
  261. *           ------------------------------------------------------
  262. *           |  Function Call: SIN       Input Parameter :  RADIANS|
  263. *           |               Output Variable :  SINX   |
  264. *           ------------------------------------------------------
  265. *
  266. case !(FUNCTION) = 'SIN' .AND. TYPE(RADIANS) <> 'U'
  267.   store RADIANS to RD
  268.   store RD-RD*RD*RD/6+RD*RD*RD*RD*RD/120-RD*RD*RD*RD*RD*RD*RD/5040 to SINX
  269.   store SINX+RD*RD*RD*RD*RD*RD*RD*RD*RD/362880 to SINX
  270.   store SINX+RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/39916800 to SINX
  271. release RADIANS, RD
  272. * <<<==================================================================>>>
  273. *
  274. *          ----------->>> Cosine Function <<<<-------------
  275. *
  276. *           ------------------------------------------------------
  277. *           |  Function Call: COS       Input Parameters:  RADIANS|
  278. *           |               Output Variable :  COSX   |
  279. *           ------------------------------------------------------
  280. *
  281. case !(FUNCTION) = 'COS' .AND. TYPE(RADIANS) <> 'U'
  282.   store RADIANS to RD
  283.   store 1-RD*RD/2+RD*RD*RD*RD/24-RD*RD*RD*RD*RD*RD/720 to COSX
  284.   store COSX+RD*RD*RD*RD*RD*RD*RD*RD/40320 to COSX
  285.   store COSX-RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/3628800 to COSX
  286.   store COSX+RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/479001600 to COSX
  287. release RADIANS, RD
  288. * <<<==================================================================>>>
  289. *
  290. *         --------->>>> Tangent Function <<<<---------------
  291. *
  292. *           ------------------------------------------------------
  293. *           |  Function Call: TAN       Input Parameters:  RADIANS|
  294. *           |               Output Variable :  TANX   |
  295. *           ------------------------------------------------------
  296. *
  297. case !(FUNCTION) = 'TAN' .AND. TYPE(RADIANS) <> 'U'
  298.   store RADIANS to RD
  299.   store RD-RD*RD*RD/6+RD*RD*RD*RD*RD/120-RD*RD*RD*RD*RD*RD*RD/5040 to SNX
  300.   store SNX+RD*RD*RD*RD*RD*RD*RD*RD*RD/362880 to SNX
  301. * store SNX+RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/39916800 to SNX
  302.   store 1-RD*RD/2+RD*RD*RD*RD/24-RD*RD*RD*RD*RD*RD/720 to CSX
  303.   store CSX+RD*RD*RD*RD*RD*RD*RD*RD/40320 to CSX
  304.   store CSX-RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/3628800 to CSX
  305. * store CSX+RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD*RD/479001600 to CSX
  306.   store SNX/CSX to TANX
  307. release RADIANS, RD, SNX, CSX
  308. * <<<=================================================================>>>
  309. *
  310. *          -------->>> Arc Tangent Function <<<----------
  311. *        ****THIS FUNCTION IS NOT ACCURATE--IT NEEDS WORK****
  312. *           ------------------------------------------------------
  313. *           |  Function Call: ATN       Input Parameters:  NUMBER |
  314. *           |               Output Variable :  RADIANS|
  315. *           ------------------------------------------------------
  316. *   These series functions need to be expanded to at least NX**41/41 to be
  317. *   accurate to the nearest 0.1 seconds when converted to DMS.
  318. *case !(FUNCTION) = 'ATN' .AND. TYPE(NUMBER) <> 'U'
  319. * store NUMBER to NX
  320. * if NX*NX < 1
  321. *    store  NX-NX*NX*NX/3+NX*NX*NX*NX*NX/5-NX*NX*NX*NX*NX*NX*NX/7;
  322. *        to RADIANS
  323. *    store  RADIANS +NX*NX*NX*NX*NX*NX*NX*NX*NX/9 to RADIANS
  324. *    store  RADIANS -NX*NX*NX*NX*NX*NX*NX*NX*NX*NX*NX/11 to RADIANS
  325. *   These series functions need to be expanded to at least 1/(41*NX**41) to be
  326. *   accurate to the nearest 0.1 seconds when converted to DMS.
  327. *else
  328. *    store  1.570796327-1/NX+1/(3*NX*NX*NX )-1/(5*NX*NX*NX*NX*NX) to RADIANS
  329. *    store  RADIANS+1/(7*NX*NX*NX*NX*NX*NX*NX)-;
  330. *        1/(9*NX*NX*NX*NX*NX*NX*NX*NX*NX) to RADIANS
  331. *    store  RADIANS+1/(11*NX*NX*NX*NX*NX*NX*NX*NX*NX*NX*NX) to RADIANS
  332. *endif
  333. *release NUMBER, NX
  334. * <<<=================================================================>>>
  335. *
  336. *     ---------->>> Natural (Naperian) Logarithm <<<---------
  337. *
  338. *           ------------------------------------------------------
  339. *           |  Function Call: LNX       Input Parameters:  NUMBER |
  340. *           |               Output Variable :  LOGX   |
  341. *           ------------------------------------------------------
  342. *
  343. case !(FUNCTION) = 'LNX' .AND. TYPE(NUMBER) <> 'U'
  344.   store (NUMBER-1.000000)/(NUMBER+1.000000) to NX, POWRX, LOGX
  345.   store 1 to PASS
  346.   do while PASS < 14
  347.      store PASS + 2 to PASS
  348.      store POWRX*NX*NX to POWRX
  349.      store LOGX to LOGO
  350.      store LOGX+POWRX/PASS to LOGX
  351.   enddo
  352. store 2.00*LOGX to LOGX
  353. store STR(LOGX,12,4) to SLOGX
  354. store  &SLOGX to LOGX
  355. release NUMBER, NX, LOGO, POWRX, PASS, SLOGX
  356. * <<<=================================================================>>>
  357. *
  358. *           ------------->>> Otherwise Undefined <<<-----------
  359. *
  360. *
  361. otherwise
  362.    store 'UNKNOWN' to FUNCTION
  363. endcase
  364. if FUNCTION <> 'UNKOWN'
  365.    release FUNCTION
  366. endif
  367. return
  368. ------
  369. *
  370. *
  371. otherwise
  372.    store 'UNKNOWN' to FUNCTION
  373. endcase
  374. if FUNCT