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 >
Wrap
Text File
|
1992-12-23
|
3KB
|
161 lines
/* mix_num2.c */
/* Copyright 1992 by P.J. LaBrocca */
#include "mixed.h"
mixed_t mix_sub(mixed_t *x, mixed_t *y)
{
mixed_t sum, xt, yt;
mix_clear( &sum );
mix_make_improper(x);
mix_make_improper(y);
xt.num = x->num * y->den;
xt.den = x->den * y->den;
yt.num = y->num * x->den;
yt.den = y->den * x->den;
sum.num = x->sign * xt.num - y->sign * yt.num;
if(sum.num < 0) {
sum.num = abs(sum.num);
sum.sign = NEGATIVE;
}
sum.den = xt.den; /*xt.den == yt.den at this point*/
if(sum.num == 0) {
sum.den = 1;
if(sum.whole == 0)
sum.sign = POSITIVE;
}
return sum;
}
mixed_t mix_add(mixed_t *x, mixed_t *y)
{
mixed_t sum, t, xt, yt;
mix_clear( &sum );
mix_make_improper(x);
mix_make_improper(y);
xt.num = x->num * y->den;
xt.den = x->den * y->den;
yt.num = y->num * x->den;
yt.den = y->den * x->den;
sum.num = x->sign * xt.num + y->sign * yt.num;
if(sum.num < 0) {
sum.num = abs(sum.num);
sum.sign = NEGATIVE;
}
sum.den = xt.den; /*xt.den == yt.den at this point*/
if(sum.num == 0) {
sum.den = 1;
if(sum.whole == 0)
sum.sign = POSITIVE;
}
return sum;
}
mixed_t mix_mul(mixed_t *x, mixed_t *y)
{
mixed_t product;
Integer xn, yn;
mix_clear( &product );
xn = x->sign * (x->whole * x->den + x->num);
yn = y->sign * (y->whole * y->den + y->num);
product.num = xn * yn;
product.den = x->den * y->den;
if(product.num < 0) {
product.num = abs(product.num);
product.sign = NEGATIVE;
}
if(product.num == 0) {
product.den = 1;
if(product.whole == 0)
product.sign = POSITIVE;
}
return product;
}
mixed_t mix_recip(mixed_t f) /*reciprocal*/
{ /* does not alter f*/
Integer tmp;
mix_make_improper( &f );
if(f.num == 0) {
mix_error("denominator will become zero");
return f;
}
tmp = f.num;
f.num = f.den;
f.den = tmp;
return f;
}
mixed_t mix_divide(mixed_t *f, mixed_t *g)
{
mixed_t rec = mix_recip( *g );
return mix_mul( f, &rec );
}
Integer mix_lcd(mixed_t *f, mixed_t *g)
{
int i = 0, j = 0;
Integer low[30];
Integer *l = low;
Integer t;
mix_factor(g);
mix_factor(f);
while(1) {
if(f->factors[1][i] == 1) {
while(g->factors[1][j] != 1)
*l++ = g->factors[1][j++];
break;
}
else if(g->factors[1][j] == 1) {
while(f->factors[1][i] != 1)
*l++ = f->factors[1][i++];
break;
}
else if(f->factors[1][i] == g->factors[1][j]) {
*l++ = f->factors[1][i];
++i;
++j;
}
else if(f->factors[1][i] > g->factors[1][j]) {
*l++ = g->factors[1][j];
++j;
}
else if(f->factors[1][i] < g->factors[1][j]) {
*l++ = f->factors[1][i];
++i;
}
}
*l = 1;
t = 1;
i = 0;
while(low[i] != 1)
t *= low[i++];
return t;
}
void mix_neg(mixed_t *f)
{
if(f->sign == NEGATIVE)
f->sign = POSITIVE;
else
f->sign = NEGATIVE;
}