/* * * Operations sur les scalaires ( rationnels ) * */ #include "scalaires.h" #include "exceptions.h" #include #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif #define PRECISION 1E6 static int pgcd(int a, int b) { if (a < b) return pgcd(b, a); if (!b) return a; return pgcd(b, a % b); } rationnel rat_constr_zero(void) { /* renvoie 0 */ rationnel temp; temp.num = 0; temp.denom = 1; return temp; } rationnel rat_constr(int num, int denom) { /* cree une fraction */ rationnel temp; int sgnnum = 1, sgndenom = 1; if (num < 0) { sgnnum = -1; num = -num; } if (denom < 0) { sgndenom = -1; denom = -denom; } if (!num) { temp.num = 0; temp.denom = 1; } else if (denom) { temp.num = sgnnum * sgndenom * num / pgcd(num, denom); temp.denom = denom / pgcd(num, denom); } else { exception(1, _("rat_constr: division by zero")); } return temp; } rationnel rat_constr_from_double(double flt) { /* cree une fraction a partir d un double */ return rat_constr(floor(flt * PRECISION), PRECISION); } void rat_destruct(rationnel rat) { /* destructeur */ } double rat_to_double(rationnel rat) { /* obtention du double correspondant a un rationnel */ return ((double) rat.num / (double) rat.denom); } rationnel rat_addition(rationnel rat1, rationnel rat2) { /* addition */ return rat_constr(rat1.num * rat2.denom + rat2.num * rat1.denom, rat1.denom * rat2.denom); } rationnel rat_soustraction(rationnel rat1, rationnel rat2) { /* soustraction */ return rat_constr(rat1.num * rat2.denom - rat2.num * rat1.denom, rat1.denom * rat2.denom); } rationnel rat_moinsunaire(rationnel rat1) { /* moins unaire */ return rat_constr(-rat1.num, rat1.denom); } rationnel rat_multiplication(rationnel rat1, rationnel rat2) { /* multiplication */ return rat_constr(rat1.num * rat2.num, rat1.denom * rat2.denom); } rationnel rat_division(rationnel rat1, rationnel rat2) { /* division */ return rat_constr(rat1.num * rat2.denom, rat1.denom * rat2.num); }