home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 13 / MA_Cover_13.bin / source / c / apl / ao.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-23  |  5.0 KB  |  443 lines

  1. #include "apl.h"
  2.  
  3. data
  4. ex_add(d1, d2)
  5. data d1, d2;
  6. {
  7.     if(fuzz(d1, -d2) == 0) return(zero);
  8.     return(d1 + d2);
  9. }
  10.  
  11. data
  12. ex_sub(d1, d2)
  13. data d1, d2;
  14. {
  15.     if(fuzz(d1, d2) == 0) return(zero);
  16.     return(d1 - d2);
  17. }
  18.  
  19. data
  20. ex_mul(d1, d2)
  21. data d1, d2;
  22. {
  23.     return(d1 * d2);
  24. }
  25.  
  26. data
  27. ex_div(d1, d2)
  28. data d1, d2;
  29. {
  30.     /* 0 div 0 is 1 */
  31.     if(d2 == zero) {
  32.         if (d1 == zero) return(one);
  33.         else error("div D");
  34.     }
  35.     return(d1 / d2);
  36. }
  37.  
  38. data
  39. ex_mod(d1, d2)
  40. data d1, d2;
  41. {
  42.     double f;
  43.  
  44.     /* x mod 0 is defined to be x */
  45.     if (d1 == zero) return(d2);
  46.     if(d1 < zero) d1 = -d1;
  47.     f = d2;
  48.     d2 = d2 - d1 * floor(f/d1);
  49.     return(d2);
  50. }
  51.  
  52. data
  53. ex_min(d1, d2)
  54. data d1, d2;
  55. {
  56.     if(d1 < d2) return(d1);
  57.     return(d2);
  58. }
  59.  
  60. data
  61. ex_max(d1, d2)
  62. data d1, d2;
  63. {
  64.     if(d1 > d2) return(d1);
  65.     return(d2);
  66. }
  67.  
  68. data
  69. ex_pwr(d1, d2)
  70. data d1, d2;
  71. {
  72.     int s;
  73.     double f1, f2;
  74.  
  75.     s = 0;
  76.     f1 = d1;
  77.     if(f1 > 0.) {
  78.         f1 = d2 * log(f1);
  79.         goto chk;
  80.     }
  81.     if(f1 == 0.) return(d2 == zero ? (data)1.0 : zero);
  82.  
  83.     /* check for integer exponent */
  84.     f2 = floor(d2);
  85.     if(fabs(d2 - f2) < thread.fuzz){
  86.         s = (int)f2%2;
  87.         f1 = d2*log(fabs(f1));
  88.         goto chk;
  89.     }
  90.     /* should check rational d2 here */
  91.     goto bad;
  92.  
  93. chk:
  94.     if(f1 < maxexp) {
  95.         d1 = exp(f1);
  96.         if(s) d1 = -d1;
  97.         return(d1);
  98.     }
  99. bad:
  100.     error("pwr D");
  101. }
  102.  
  103. data
  104. ex_log(d1, d2)
  105. data d1, d2;
  106. {
  107.     double f1, f2;
  108.  
  109.     f1 = d1;
  110.     f2 = d2;
  111.     if(f1 <= 0. || f2 <= 0.) error("log D");
  112.     d1 = log(f2)/log(f1);
  113.     return(d1);
  114. }
  115.  
  116. data
  117. ex_cir(d1, d2)
  118. data d1, d2;
  119. {
  120.     double f, f1;
  121.  
  122.     switch(fix(d1)) {
  123.  
  124.     default:
  125.         error("crc D");
  126.  
  127.     case -7:
  128.         /* arc tanh */
  129.         f = d2;
  130.         if(f <= -1. || f >= 1.) error("tanh D");
  131.         f = log((1.+f)/(1.-f))/2.;
  132.         goto ret;
  133.  
  134.     case -6:
  135.         /* arc cosh */
  136.         f = d2;
  137.         if(f < 1.) error("cosh D");
  138.         f = log(f+sqrt(f*f-1.));
  139.         goto ret;
  140.  
  141.     case -5:
  142.         /* arc sinh */
  143.         f = d2;
  144.         f = log(f+sqrt(f*f+1.));
  145.         goto ret;
  146.  
  147.     case -4:
  148.         /* sqrt(-1 + x*x) */
  149.         f = -one + d2*d2;
  150.         goto sq;
  151.  
  152.     case -3:
  153.         /* arc tan */
  154.         f = d2;
  155.         f = atan(f);
  156.         goto ret;
  157.  
  158.     case -2:
  159.         /* arc cos */
  160.         f = d2;
  161.         if(f < -1. || f > 1.) error("arc cos D");
  162.         f = atan2(sqrt(1.-f*f), f);
  163.         goto ret;
  164.  
  165.     case -1:
  166.         /* arc sin */
  167.         f = d2;
  168.         if(f < -1. || f > 1.) error("arc sin D");
  169.         f = atan2(f, sqrt(1.-f*f));
  170.         goto ret;
  171.  
  172.     case 0:
  173.         /* sqrt(1 - x*x) */
  174.         f = one - d2*d2;
  175.         goto sq;
  176.  
  177.     case 1:
  178.         /* sin */
  179.         f = d2;
  180.         f = sin(f);
  181.         goto ret;
  182.  
  183.     case 2:
  184.         /* cos */
  185.         f = d2;
  186.         f = cos(f);
  187.         goto ret;
  188.  
  189.     case 3:
  190.         /* tan */
  191.         f = d2;
  192.         f1 = cos(f);
  193.         if(f1 == 0.) f = exp(maxexp);
  194.         else f = sin(f)/f1;
  195.         goto ret;
  196.  
  197.     case 4:
  198.         /* sqrt(1 + x*x) */
  199.         f = one + d2*d2;
  200.         goto sq;
  201.  
  202.     case 5:
  203.         /* sinh */
  204.         f = d2;
  205.         if(f < -maxexp || f > maxexp) error("sinh D");
  206.         f = exp(f);
  207.         f = (f-1./f)/2.;
  208.         goto ret;
  209.  
  210.     case 6:
  211.         /* cosh */
  212.         f = d2;
  213.         if(f < -maxexp || f > maxexp) error("cosh D");
  214.         f = exp(f);
  215.         f = (f+1./f)/2.;
  216.         goto ret;
  217.  
  218.     case 7:
  219.         /* tanh */
  220.         f = d2;
  221.         if(f > maxexp) {
  222.             f = 1.;
  223.             goto ret;
  224.         }
  225.         if(f < -maxexp) {
  226.             f = -1.;
  227.             goto ret;
  228.         }
  229.         f = exp(f);
  230.         f = (f-1./f)/(f+1./f);
  231.         goto ret;
  232.     }
  233.  
  234. sq:
  235.     if(f < 0.) error("sqrt D");
  236.     f = sqrt(f);
  237.  
  238. ret:
  239.     d1 = f;
  240.     return(d1);
  241. }
  242.  
  243. data
  244. ex_comb(d1, d2)
  245. data d1, d2;
  246. {
  247.     double f;
  248.  
  249.     if(d1 > d2) return(zero);
  250.     f = gamma(d2+1.) - gamma(d1+1.) - gamma(d2-d1+1.);
  251.     if(f > maxexp) error("comb D");
  252.     d1 = exp(f);
  253.     return(d1);
  254. }
  255.  
  256. data
  257. ex_and(d1, d2)
  258. data d1, d2;
  259. {
  260.     if(d1!=zero && d2!=zero) return(one);
  261.     return(zero);
  262. }
  263.  
  264. data
  265. ex_or(d1, d2)
  266. data d1, d2;
  267. {
  268.     if(d1!=zero || d2!=zero) return(one);
  269.     return(zero);
  270. }
  271.  
  272. data
  273. ex_nand(d1, d2)
  274. data d1, d2;
  275. {
  276.     if(d1!=zero && d2!=zero) return(zero);
  277.     return(one);
  278. }
  279.  
  280. data
  281. ex_nor(d1, d2)
  282. data d1, d2;
  283. {
  284.     if(d1!=zero || d2!=zero) return(zero);
  285.     return(one);
  286. }
  287.  
  288. data
  289. ex_lt(d1, d2)
  290. data d1, d2;
  291. {
  292.     if(fuzz(d1, d2) < 0) return(one);
  293.     return(zero);
  294. }
  295.  
  296. data
  297. ex_le(d1, d2)
  298. data d1, d2;
  299. {
  300.     if(fuzz(d1, d2) <= 0) return(one);
  301.     return(zero);
  302. }
  303.  
  304. data
  305. ex_eq(d1, d2)
  306. data d1, d2;
  307. {
  308.     if(fuzz(d1, d2) == 0) return(one);
  309.     return(zero);
  310. }
  311.  
  312. data
  313. ex_ge(d1, d2)
  314. data d1, d2;
  315. {
  316.     if(fuzz(d1, d2) >= 0) return(one);
  317.     return(zero);
  318. }
  319.  
  320. data
  321. ex_gt(d1, d2)
  322. data d1, d2;
  323. {
  324.     if(fuzz(d1, d2) > 0) return(one);
  325.     return(zero);
  326. }
  327.  
  328. data
  329. ex_ne(d1, d2)
  330. data d1, d2;
  331. {
  332.     if(fuzz(d1, d2) != 0) return(one);
  333.     return(zero);
  334. }
  335.  
  336. data
  337. ex_plus(d)
  338. data d;
  339. {
  340.     return(d);
  341. }
  342.  
  343. data
  344. ex_minus(d)
  345. data d;
  346. {
  347.     return(-d);
  348. }
  349.  
  350. data
  351. ex_sgn(d)
  352. data d;
  353. {
  354.     if(d == zero) return(zero);
  355.     if(d < zero) return(-one);
  356.     return(one);
  357. }
  358.  
  359. data
  360. ex_recip(d)
  361. data d;
  362. {
  363.     if(d == zero) error("recip D");
  364.     return(one/d);
  365. }
  366.  
  367. data
  368. ex_abs(d)
  369. data d;
  370. {
  371.     if(d < zero) return(-d);
  372.     return(d);
  373. }
  374.  
  375. data
  376. ex_floor(d)
  377. data d;
  378. {
  379.     d = floor(d + thread.fuzz);
  380.     return(d);
  381. }
  382.  
  383. data
  384. ex_ceil(d)
  385. data d;
  386. {
  387.     d = ceil(d - thread.fuzz);
  388.     return(d);
  389. }
  390.  
  391. data
  392. ex_exp(d)
  393. data d;
  394. {
  395.     double f;
  396.  
  397.     f = d;
  398.     if(f > maxexp) error ("exp D");
  399.     d = exp(f);
  400.     return(d);
  401. }
  402.  
  403. data
  404. ex_loge(d)
  405. data d;
  406. {
  407.     double f;
  408.  
  409.     f = d;
  410.     if(f <= 0.) error("log D");
  411.     d = log(f);
  412.     return(d);
  413. }
  414.  
  415. data
  416. ex_pi(d)
  417. data d;
  418. {
  419.     d = pi * d;
  420.     return(d);
  421. }
  422.  
  423. data
  424. ex_fac(d)
  425. data d;
  426. {
  427.     double f;
  428.  
  429.     f = gamma(d+1.);
  430.     if(f > maxexp) error("fac D");
  431.     d = exp(f);
  432.     if(signgam < 0) d = -d;            /* if (signgam) in version 6 */
  433.     return(d);
  434. }
  435.  
  436. data
  437. ex_not(d)
  438. data d;
  439. {
  440.     if(d == zero) return(one);
  441.     return(zero);
  442. }
  443.