git » metnum-tp1.git » commit d6b4760

Eliminar el cast de numero a double

author Alberto Bertogli
2010-08-31 19:00:22 UTC
committer Alberto Bertogli
2010-08-31 19:00:22 UTC
parent 3b7a65c8b0826fe9492672be5b0d8b3f1cc6aec8

Eliminar el cast de numero a double

No queremos ese cast para evitar operar sin darnos cuenta entre dos numeros
convertidos a double.

Este parche elimina el cast, agrega un nuevo método numero.to_double(), y
operadores no-miembros para poder hacer cosas del tipo:

	1 / numero

Y que eso opere con nuestra aritmetica y devuelva un numero, y no como un
double como pasaba antes.

Se verificaron velozmente los resultados y son los mismos, como es de
esperarse.

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;
 }