exact.h (1715B)
1 /* exact.h - valores exactos de la calculadora: (a + b·√r)/d · π^p 2 * (fracciones, radicales simples y multiplos de π). Todo en int64 con chequeo de 3 * desborde: si una operacion no se puede representar devuelve falso y la cuenta 4 * sigue en decimal. */ 5 #ifndef EXACT_H 6 #define EXACT_H 7 #include <stdint.h> 8 #include <stdbool.h> 9 #include "dec.h" 10 11 typedef struct { 12 int64_t a, b, r, d; /* d > 0; b = 0 => r = 1; si b != 0, r > 1 libre de cuadrados */ 13 uint8_t p; /* 1 = multiplicado por π (entonces b = 0) */ 14 } Ex; 15 16 bool ex_rat(Ex *x, int64_t a, int64_t d); /* a/d normalizado */ 17 bool ex_norm(Ex *x); 18 static inline bool ex_is_rat(const Ex *x) { return x->b == 0 && !x->p; } 19 static inline bool ex_is_int(const Ex *x) { return ex_is_rat(x) && x->d == 1; } 20 static inline bool ex_is_zero(const Ex *x) { return x->a == 0 && x->b == 0; } 21 bool ex_eq(const Ex *x, const Ex *y); 22 23 bool ex_add(Ex *o, const Ex *x, const Ex *y); 24 bool ex_sub(Ex *o, const Ex *x, const Ex *y); 25 bool ex_mul(Ex *o, const Ex *x, const Ex *y); 26 bool ex_div(Ex *o, const Ex *x, const Ex *y); 27 bool ex_neg(Ex *o, const Ex *x); 28 bool ex_pow_int(Ex *o, const Ex *x, int64_t n); 29 bool ex_sqrt(Ex *o, const Ex *x); 30 bool ex_root(Ex *o, const Ex *x, int64_t n); /* solo si da racional */ 31 Dec ex_to_dec(const Ex *x); 32 int ex_sign(const Ex *x); 33 34 /* trigonometria exacta: angulo en la unidad dada (ver dmath.h) */ 35 bool ex_sin(Ex *o, const Ex *x, int ang); 36 bool ex_cos(Ex *o, const Ex *x, int ang); 37 bool ex_tan(Ex *o, const Ex *x, int ang, bool *undef); 38 bool ex_asin(Ex *o, const Ex *x, int ang); 39 bool ex_acos(Ex *o, const Ex *x, int ang); 40 bool ex_atan(Ex *o, const Ex *x, int ang); 41 42 int64_t i64_gcd(int64_t a, int64_t b); 43 44 #endif