author | Alberto Bertogli
<albertito@blitiri.com.ar> 2010-08-31 19:00:22 UTC |
committer | Alberto Bertogli
<albertito@blitiri.com.ar> 2010-08-31 19:00:22 UTC |
parent | 3b7a65c8b0826fe9492672be5b0d8b3f1cc6aec8 |
aritmetica.cpp | +25 | -1 |
aritmetica.hpp | +25 | -13 |
babilonio.cpp | +1 | -1 |
binomial.cpp | +4 | -4 |
calc.cpp | +3 | -3 |
fcont.cpp | +1 | -1 |
diff --git a/aritmetica.cpp b/aritmetica.cpp index 3a2d54d..ab0661f 100644 --- a/aritmetica.cpp +++ b/aritmetica.cpp @@ -9,6 +9,11 @@ uint64_t to_u64(double n) return *p; } +uint64_t to_u64(numero n) +{ + return to_u64(n.to_double()); +} + double to_double(uint64_t n) { double *p; @@ -42,6 +47,11 @@ numero::numero(int prec, double real) this->real = trunc(prec, real); } +int numero::get_prec() const +{ + return this->prec; +} + /* Todas las operaciónes son iguales, por lo que armamos una macro para * crearlas y ahorrarnos el copy-paste */ #define DEF_OP(OP) \ @@ -59,6 +69,14 @@ numero::numero(int prec, double real) trunc(this->prec, this->real) \ OP \ trunc(this->prec, b)); \ + } \ + \ + numero operator OP (const double &a, const numero &b) \ + { \ + return numero(b.get_prec(), \ + trunc(b.get_prec(), a) \ + OP \ + b.to_double() ); \ } DEF_OP(+) @@ -78,7 +96,13 @@ numero numero::operator = (numero n) this->real = n.real; return *this; } -numero::operator double() const + +//numero::operator double() const +//{ +// return this->real; +//} + +double numero::to_double() const { return this->real; } diff --git a/aritmetica.hpp b/aritmetica.hpp index 4cc16a8..34f2868 100644 --- a/aritmetica.hpp +++ b/aritmetica.hpp @@ -2,17 +2,6 @@ #ifndef _ARITMETICA_HPP #define _ARITMETICA_HPP -/* Devuelve un uint64_t con el contenido del double, porque el cast no es tan - * pavote. */ -uint64_t to_u64(double n); - -/* Devuelve un double con el contenido del uint64_t, porque el cast no es tan - * pavote. */ -double to_double(uint64_t n); - -/* Recorta la precision del double dado, devuelve un double "recortado". */ -double trunc(int prec, double n); - class numero { public: @@ -35,8 +24,12 @@ public: numero operator = (double n); numero operator = (numero n); - // Cast to a double - operator double() const; + // Cast a double + //operator double() const; + double to_double() const; + + // Devolver la precision + int get_prec() const; private: // Precision @@ -47,5 +40,24 @@ private: double real; }; +/* Operadores para poder hacer double <op> numero y obtener un numero */ +numero operator + (const double &a, const numero &b); +numero operator - (const double &a, const numero &b); +numero operator * (const double &a, const numero &b); +numero operator / (const double &a, const numero &b); + +/* Devuelve un uint64_t con el contenido del double, porque el cast no es tan + * pavote. */ +uint64_t to_u64(double n); +uint64_t to_u64(numero n); + +/* Devuelve un double con el contenido del uint64_t, porque el cast no es tan + * pavote. */ +double to_double(uint64_t n); + +/* Recorta la precision del double dado, devuelve un double "recortado". */ +double trunc(int prec, double n); + + #endif // ifdef _ARITMETICA_HPP diff --git a/babilonio.cpp b/babilonio.cpp index 9b81e21..4f50b1b 100644 --- a/babilonio.cpp +++ b/babilonio.cpp @@ -26,7 +26,7 @@ int main(int argc, char *argv[]) n1 = n0 / 2.0 + 1 / n0; } - printf("%.60f 0x%lx\n", (double) n1, to_u64(n1)); + printf("%.60f 0x%lx\n", n1.to_double(), to_u64(n1)); return 0; } diff --git a/binomial.cpp b/binomial.cpp index 2c0cc39..a2fde3e 100644 --- a/binomial.cpp +++ b/binomial.cpp @@ -46,15 +46,15 @@ int main(int argc, char *argv[]) /* XXX DEBUG - SACAR */ #if 0 printf(" %.60f 0x%lx\n", - (double) numerador, to_u64(numerador)); + numerador.to_double(), to_u64(numerador)); printf(" %.60f 0x%lx\n", - (double) denominador, to_u64(denominador)); + denominador.to_double(), to_u64(denominador)); printf(" ---\n"); #endif - //printf(" %d %.60f 0x%lx\n", i, (double) n, to_u64(n)); + //printf(" %d %.60f 0x%lx\n", i, n.to_double(), to_u64(n)); } - printf("%.60f 0x%lx\n", (double) n, to_u64(n)); + printf("%.60f 0x%lx\n", n.to_double(), to_u64(n)); return 0; } diff --git a/calc.cpp b/calc.cpp index d21400b..4574fee 100644 --- a/calc.cpp +++ b/calc.cpp @@ -16,8 +16,8 @@ int main(int argc, char *argv[]) char op = argv[3][0]; numero b(prec, strtod(argv[4], NULL)); - printf("a =\t %.60f 0x%lx\n", (double) a, to_u64(a)); - printf("b =\t %.60f 0x%lx\n", (double) b, to_u64(b)); + printf("a =\t %.60f 0x%lx\n", a.to_double(), to_u64(a)); + printf("b =\t %.60f 0x%lx\n", b.to_double(), to_u64(b)); numero res; switch (op) { @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) return 1; } - printf("a %c b =\t %.60f 0x%lx\n", op, (double) res, to_u64(res)); + printf("a %c b =\t %.60f 0x%lx\n", op, res.to_double(), to_u64(res)); return 0; } diff --git a/fcont.cpp b/fcont.cpp index b9d6ed8..c613f5d 100644 --- a/fcont.cpp +++ b/fcont.cpp @@ -25,7 +25,7 @@ int main(int argc, char *argv[]) /* El último término tiene sumado 1 en lugar de 2 */ n = numero(prec, 1) / n + 1.0; - printf("%.60f 0x%lx\n", (double) n, to_u64(n)); + printf("%.60f 0x%lx\n", n.to_double(), to_u64(n)); return 0; }