num.h (1483B)
1 /* num.h - el valor de la calculadora: siempre el decimal y, si se puede, la forma 2 * exacta (fraccion, radical, multiplo de π). */ 3 #ifndef NUM_H 4 #define NUM_H 5 #include "dec.h" 6 #include "exact.h" 7 8 typedef struct { 9 Dec v; /* el decimal (si hay forma exacta, sale de ella) */ 10 Ex x; 11 uint8_t exact; 12 } Num; 13 14 Num num_dec(Dec v); 15 Num num_int(int64_t v); 16 Num num_ex(const Ex *x); 17 Num num_err(void); 18 /* literal: digitos con '.', y exponente decimal (x10^k); exacto si entra */ 19 Num num_lit(const char *digits, int exp10); 20 static inline bool num_bad(const Num *n) { return n->v.err != DE_OK; } 21 22 Num num_add(Num a, Num b); 23 Num num_sub(Num a, Num b); 24 Num num_mul(Num a, Num b); 25 Num num_div(Num a, Num b); 26 Num num_neg(Num a); 27 Num num_pow(Num a, Num b); 28 Num num_sqrt(Num a); 29 Num num_root(Num idx, Num a); 30 Num num_abs(Num a); 31 Num num_fact(Num a); 32 Num num_npr(Num n, Num r); 33 Num num_ncr(Num n, Num r); 34 Num num_logb(Num b, Num x); 35 Num num_log10(Num x); 36 Num num_ln(Num x); 37 Num num_sin(Num x, int ang); 38 Num num_cos(Num x, int ang); 39 Num num_tan(Num x, int ang); 40 Num num_asin(Num x, int ang); 41 Num num_acos(Num x, int ang); 42 Num num_atan(Num x, int ang); 43 Num num_int_part(Num x); /* Int: hacia cero */ 44 Num num_floor(Num x); /* Intg */ 45 Num num_gcd(Num a, Num b); 46 Num num_lcm(Num a, Num b); 47 int num_cmp(Num a, Num b); 48 /* fuerza decimal (S⇔D, o cuando la forma exacta no se puede mostrar) */ 49 Num num_to_dec(Num a); 50 51 #endif