/* * * Operations sur les scalaires ( rationnels ) * */ #include "scalaires.h" #include #define PRECISION 1E6 static int pgcd(int a, int b) { if (!a) return b; if (a < b) return pgcd(b, 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; if (denom < 0) { denom = -denom; num = -num; } temp.num = num / pgcd(num, denom); temp.denom = denom / pgcd(num, denom); 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); }