git » metnum-tp1.git » commit 6bcca59

Hacer que round_up no desnormalice el numero

author Rodrigo Campos
2010-09-09 02:47:08 UTC
committer Rodrigo Campos
2010-09-09 02:47:08 UTC
parent fbb29a2bd843bd767e4b55dfaeea53732768cf76

Hacer que round_up no desnormalice el numero

Si ponemos un '1' a mano en el bit prec + 1 podemos desnormalizar el numero (y
esto es un NaN y cualquier operacion con un NaN da NaN en general). Porque si el
numero era -1 (0xbff0000000000000, es decir -1 bit de signo, algo en el
exponente y todos ceros en la mantisa porque esta el "1 implicito") al agregar
en 1 en la posicion prec + 1 (es decir, cualquiera entre 51 y 2) el numero queda
desnormalizado.

Pero no era necesario poner ese bit en uno, simplemente con truncar a prec+1 y
dejar lo que tiene el número n original (el que vamos a redondear) alcanza por
lo que explicamos en el informe en la seccion de redondeo =)

aritmetica.cpp +2 -18

diff --git a/aritmetica.cpp b/aritmetica.cpp
index 716a612..b687421 100644
--- a/aritmetica.cpp
+++ b/aritmetica.cpp
@@ -38,24 +38,8 @@ double trunc(int prec, double n)
 
 double round_up(int prec, double n)
 {
-	/* Sabemos que el double tiene 64 bits en total, de los cuales se usan
-	 * 52 para la mantisa. */
-
-	// Truncamos n
-	uint64_t t = to_u64(trunc(prec, n));
-
-	// Nos armamos el mismo numero truncado pero que tiene el 1 en el bit
-	// prec + 1
-	uint64_t to_round = t | (1 << (52 - prec - 1)) ;
-
-	// Nos armamos el double (normalizado, etc. porque la compu hace las
-	// cuentas) que tiene 1 en la posicion prec+1 de la mantisa
-	double to_round_d = to_double(to_round) - to_double(t);
-
-	// n + to_round_d es el ajuste que hay que hacer por redondeo a prec
-	// digitos. Como n + to_round_d ya esta redondeado a prec digitos,
-	// lo truncamos a prec digitos de precision
-	return trunc(prec, n + to_round_d);
+	double round = trunc(prec + 1, n) - trunc(prec, n);
+	return n + round;
 }