git » metnum-tp1.git » commit 090f8fd

Arreglar binomiales, y hacer que _dec muestre resultados parciales

author Alberto Bertogli
2010-09-08 03:56:06 UTC
committer Alberto Bertogli
2010-09-08 04:11:06 UTC
parent 70793850047ce55e94ecac525f840d9c30137018

Arreglar binomiales, y hacer que _dec muestre resultados parciales

Los binomiales tenian un bug que cuando le pediamos n terminos, nos calculaba
n+1. Esto es facil de ver pidiendole que nos de 1 termino: deberia mostrarnos
1, pero en cambio mostraba 1.5.

De paso, se hace que binomial_dec emita los resultados parciales, lo que
acelera notablemente la generación de datos para graficar.

binomial.cpp +4 -2
binomial_dec.cpp +14 -10
binomial_inc.cpp +4 -2
gen_plot_data.sh +1 -0

diff --git a/binomial.cpp b/binomial.cpp
index 24611c4..84a63a5 100644
--- a/binomial.cpp
+++ b/binomial.cpp
@@ -28,9 +28,11 @@ int main(int argc, char *argv[])
 
 	/* Valor inicial, el del primer término */
 	numero n(prec, 1);
+	print_result(1, n);
 
-	/* Loop de la serie, nterm términos */
-	for (int i = 1; i <= nterm; i++) {
+	/* Loop de la serie, nterm - 1 términos (el primero, por el cual
+	 * arrancamos, ya esta fijo arriba) */
+	for (int i = 1; i < nterm; i++) {
 
 		/* numerador: 1/2 (1/2 - 1) (1/2 - 2) ...
 		 * hasta (1/2 - i - 1) */
diff --git a/binomial_dec.cpp b/binomial_dec.cpp
index 6791c64..0293c53 100644
--- a/binomial_dec.cpp
+++ b/binomial_dec.cpp
@@ -1,8 +1,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <list>
 #include <stdint.h>
+#include <vector>
 #include "aritmetica.hpp"
 #include "util.hpp"
 
@@ -40,14 +40,15 @@ int main(int argc, char *argv[])
 	// Vamos a hacer una lista con los terminos para ir sumando del ultimo
 	// al primero
 
-	list<numero> terminos;
+	vector<numero> terminos;
 
 	/* Ponemos el primer termino de la seie */
 	numero a_i(prec, 1);
 	terminos.push_back(a_i);
 
-	/* Loop de la serie, nterm términos */
-	for (int i = 0; i < nterm; i++) {
+	/* Loop de la serie, nterm - 1 términos (el 1 lo acabamos de pushear
+	 * arriba) */
+	for (int i = 0; i < nterm - 1; i++) {
 
 		a_i = a_i * b_i(i);
 		terminos.push_back(a_i);
@@ -63,13 +64,16 @@ int main(int argc, char *argv[])
 		//printf(" %d %.60f 0x%" print_64t "x\n", i, n.to_double(), to_u64(n));
 	}
 
-	numero n(prec, 0);
-	list<numero>::iterator it;
-	terminos.reverse();
-	for (it=terminos.begin() ; it != terminos.end(); it++)
-		n = n + *it;
+	/* Vamos generando los parciales, sumando siempre de atras para
+	 * adelante */
+	for (int i = 0; i < nterm; i++) {
+		numero n(prec, 0);
+		for (int j = 0; j <= i; j++) {
+			n = n + terminos[i - j];
+		}
 
-	print_result(nterm, n);
+		print_result(i + 1, n);
+	}
 
 	return 0;
 }
diff --git a/binomial_inc.cpp b/binomial_inc.cpp
index 39587e5..4823915 100644
--- a/binomial_inc.cpp
+++ b/binomial_inc.cpp
@@ -36,11 +36,13 @@ int main(int argc, char *argv[])
 
 	/* Valor inicial, el del primer término */
 	numero n(prec, 1);
+	print_result(1, n);
 
 	numero a_i(prec, 1);
 
-	/* Loop de la serie, nterm términos */
-	for (int i = 0; i < nterm; i++) {
+	/* Loop de la serie, nterm - 1 términos (el primero, por el cual
+	 * arrancamos, ya esta fijo arriba) */
+	for (int i = 0; i < nterm - 1; i++) {
 
 		numero antes = n;
 
diff --git a/gen_plot_data.sh b/gen_plot_data.sh
index 1f1214d..f8abf74 100755
--- a/gen_plot_data.sh
+++ b/gen_plot_data.sh
@@ -31,6 +31,7 @@ maxiter["fcont_int"]=50
 declare -A isincr
 isincr["binomial"]=1
 isincr["binomial_inc"]=1
+isincr["binomial_dec"]=1
 
 algolist=${!maxiter[*]}