home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_04 / 1104078a < prev    next >
Text File  |  1992-12-23  |  3KB  |  161 lines

  1. /* mix_num2.c */
  2. /* Copyright 1992 by P.J. LaBrocca */
  3.  
  4. #include "mixed.h"
  5.  
  6. mixed_t mix_sub(mixed_t *x, mixed_t *y)
  7. {
  8.     mixed_t sum, xt, yt;
  9.  
  10.     mix_clear( &sum );
  11.     mix_make_improper(x);
  12.     mix_make_improper(y);
  13.  
  14.     xt.num = x->num * y->den;
  15.     xt.den = x->den * y->den;
  16.     yt.num = y->num * x->den;
  17.     yt.den = y->den * x->den;
  18.  
  19.     sum.num = x->sign * xt.num - y->sign * yt.num;
  20.  
  21.     if(sum.num < 0) {
  22.         sum.num = abs(sum.num);
  23.         sum.sign = NEGATIVE;
  24.     }
  25.     sum.den = xt.den;    /*xt.den == yt.den at this point*/
  26.     if(sum.num == 0) {
  27.         sum.den = 1;
  28.         if(sum.whole == 0)
  29.             sum.sign = POSITIVE;
  30.     }
  31.     return sum;
  32. }
  33.  
  34. mixed_t mix_add(mixed_t *x, mixed_t *y)
  35. {
  36.     mixed_t sum, t, xt, yt;
  37.  
  38.     mix_clear( &sum );
  39.     
  40.     mix_make_improper(x);
  41.     mix_make_improper(y);
  42.  
  43.     xt.num = x->num * y->den;
  44.     xt.den = x->den * y->den;
  45.     yt.num = y->num * x->den;
  46.     yt.den = y->den * x->den;
  47.  
  48.     sum.num = x->sign * xt.num + y->sign * yt.num;
  49.  
  50.     if(sum.num < 0) {
  51.         sum.num = abs(sum.num);
  52.         sum.sign = NEGATIVE;
  53.     }
  54.     sum.den = xt.den;    /*xt.den == yt.den at this point*/
  55.  
  56.     if(sum.num == 0) {
  57.         sum.den = 1;
  58.         if(sum.whole == 0)
  59.             sum.sign = POSITIVE;
  60.     }
  61.     return sum;
  62. }
  63.  
  64. mixed_t mix_mul(mixed_t *x, mixed_t *y)
  65. {
  66.     mixed_t product;
  67.     Integer xn, yn;
  68.  
  69.     mix_clear( &product );
  70.  
  71.     xn = x->sign * (x->whole * x->den + x->num);
  72.     yn = y->sign * (y->whole * y->den + y->num);
  73.  
  74.     product.num = xn * yn;
  75.     product.den = x->den * y->den;
  76.     if(product.num < 0) {
  77.         product.num = abs(product.num);
  78.         product.sign = NEGATIVE;
  79.     }
  80.     if(product.num == 0) {
  81.         product.den = 1;
  82.         if(product.whole == 0)
  83.             product.sign = POSITIVE;
  84.     }
  85.     return product;
  86. }
  87.  
  88. mixed_t mix_recip(mixed_t f)  /*reciprocal*/
  89. {                       /* does not alter f*/
  90.     Integer tmp;
  91.  
  92.     mix_make_improper( &f );
  93.     if(f.num == 0) {
  94.         mix_error("denominator will become zero");
  95.         return f;
  96.     }
  97.  
  98.     tmp = f.num;
  99.     f.num = f.den;
  100.     f.den = tmp;
  101.     return f;
  102. }
  103.  
  104. mixed_t mix_divide(mixed_t *f, mixed_t *g)
  105. {
  106.     mixed_t rec = mix_recip( *g );
  107.     
  108.     return mix_mul( f, &rec );
  109. }
  110.  
  111. Integer mix_lcd(mixed_t *f, mixed_t *g)
  112. {
  113.     int i = 0, j = 0;
  114.     Integer low[30];
  115.     Integer *l = low;
  116.     Integer t;
  117.  
  118.     mix_factor(g);
  119.     mix_factor(f);
  120.     while(1) {
  121.         if(f->factors[1][i] == 1) {
  122.             while(g->factors[1][j] != 1)
  123.               *l++ = g->factors[1][j++];
  124.             break;
  125.         }
  126.         else if(g->factors[1][j] == 1) {
  127.             while(f->factors[1][i] != 1)
  128.               *l++ = f->factors[1][i++];
  129.             break;
  130.         }
  131.         else if(f->factors[1][i] == g->factors[1][j]) {
  132.             *l++ = f->factors[1][i];
  133.             ++i;
  134.             ++j;
  135.         }
  136.         else if(f->factors[1][i] > g->factors[1][j]) {
  137.             *l++ = g->factors[1][j];
  138.             ++j;
  139.         }
  140.         else if(f->factors[1][i] < g->factors[1][j]) {
  141.             *l++ = f->factors[1][i];
  142.             ++i;
  143.         }
  144.     }
  145.     *l = 1;
  146.     t = 1;
  147.     i = 0;
  148.     while(low[i] != 1)
  149.         t *= low[i++];
  150.     return t;
  151. }
  152.  
  153. void mix_neg(mixed_t *f)
  154. {
  155.     if(f->sign == NEGATIVE)
  156.         f->sign = POSITIVE;
  157.     else
  158.         f->sign = NEGATIVE;
  159. }
  160.  
  161.