git » metnum-tp1.git » commit 799d1dd

Agregar calculos alternativos del metodo binomial

author Rodrigo Campos
2010-09-05 22:38:17 UTC
committer Alberto Bertogli
2010-09-06 21:26:42 UTC
parent ab0c74c16f99f886b212f048f1d1363b23807903

Agregar calculos alternativos del metodo binomial

Makefile +9 -1
aritmetica.cpp +4 -0
aritmetica.hpp +2 -0
binomial_dec.cpp +74 -0
binomial_inc.cpp +72 -0

diff --git a/Makefile b/Makefile
index 81742b5..7e0a7e6 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CXXFLAGS += -Wall -std=c++98 -pedantic -Wno-long-long
 
 OBJS = aritmetica.o
 
-default: calc babilonio binomial fcont
+default: calc babilonio binomial fcont binomial_inc binomial_dec
 
 all: default
 
@@ -19,10 +19,18 @@ fcont: $(OBJS) fcont.o
 binomial: $(OBJS) binomial.o
 	$(CXX) $(CXXFLAGS) $^ -o $@
 
+binomial_inc: $(OBJS) binomial_inc.o
+	$(CXX) $(CXXFLAGS) $^ -o $@
+
+binomial_dec: $(OBJS) binomial_dec.o
+	$(CXX) $(CXXFLAGS) $^ -o $@
+
 clean:
 	rm -f $(OBJS)
 	rm -f calc.o calc
 	rm -f babilonio.o babilonio
 	rm -f fcont.o fcont
 	rm -f binomial.o binomial
+	rm -f binomial_inc binomial_inc.o
+	rm -f binomial_dec binomial_dec.o
 
diff --git a/aritmetica.cpp b/aritmetica.cpp
index c2fa0f0..9574083 100644
--- a/aritmetica.cpp
+++ b/aritmetica.cpp
@@ -122,6 +122,10 @@ numero numero::operator = (numero n)
 	return *this;
 }
 
+bool numero::operator == (numero n)
+{
+	return (n.real == this->real);
+}
 //numero::operator double() const
 //{
 //	return this->real;
diff --git a/aritmetica.hpp b/aritmetica.hpp
index ed41c20..650b908 100644
--- a/aritmetica.hpp
+++ b/aritmetica.hpp
@@ -37,6 +37,8 @@ public:
 	numero operator = (double n);
 	numero operator = (numero n);
 
+	bool operator == (numero n);
+
 	// Cast a double
 	//operator double() const;
 	double to_double() const;
diff --git a/binomial_dec.cpp b/binomial_dec.cpp
new file mode 100644
index 0000000..b84dae8
--- /dev/null
+++ b/binomial_dec.cpp
@@ -0,0 +1,74 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <list>
+#include <stdint.h>
+#include "aritmetica.hpp"
+
+using namespace std;
+
+int prec;
+
+numero b_i(int j)
+{
+	numero ret(prec, 1);
+
+	// [(1 - 2J) / (j+1)] / 2
+	numero num(prec, 2);
+	num = num * j; //2*J
+	num = 1 - num ; //1-2J
+	numero den(prec, 1);
+	den = den +j;
+	ret = ret * (num / den) / 2;
+	//printf(" %d %.60f 0x%" print_64t "x\n", j, ret.to_double(),
+	//		to_u64(ret));
+
+	return ret;
+}
+
+int main(int argc, char *argv[])
+{
+	if (argc != 3) {
+		printf("Uso: %s <prec> <nterm>\n", argv[0]);
+		return 1;
+	}
+	
+	prec = atoi(argv[1]);
+	int nterm = atoi(argv[2]);
+
+	// Vamos a hacer una lista con los terminos para ir sumando del ultimo
+	// al primero
+
+	list<numero> terminos;
+
+	/* Valor inicial, el del primer término */
+	numero a_i(prec, 1);
+	terminos.push_back(a_i);
+	/* Loop de la serie, nterm términos */
+	for (int i = 0; i < nterm; i++) {
+
+		a_i = a_i * b_i(i);
+		terminos.push_back(a_i);
+
+		/* XXX DEBUG - SACAR */
+		#if 0
+		printf("  %.60f 0x%" print_64t "x\n",
+				numerador.to_double(), to_u64(numerador));
+		printf("  %.60f 0x%" print_64t "x\n",
+				denominador.to_double(), to_u64(denominador));
+		printf("  ---\n");
+		#endif
+		//printf(" %d %.60f 0x%" print_64t "x\n", i, n.to_double(), to_u64(n));
+	}
+
+	numero n(prec, 1);
+	list<numero>::iterator it;
+	for ( it=terminos.end() ; it != terminos.begin(); it--)
+		n = n + *it;
+
+	
+	printf("%.60f 0x%" print_64t "x\n", n.to_double(), to_u64(n));
+
+	return 0;
+}
+
diff --git a/binomial_inc.cpp b/binomial_inc.cpp
new file mode 100644
index 0000000..d205eb2
--- /dev/null
+++ b/binomial_inc.cpp
@@ -0,0 +1,72 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "aritmetica.hpp"
+
+int prec;
+
+numero b_i(int j)
+{
+	numero ret(prec, 1);
+
+	// [(1 - 2J) / (j+1)] / 2
+	numero num(prec, 2);
+	num = num * j; //2*J
+	num = 1 - num ; //1-2J
+	numero den(prec, 1);
+	den = den +j;
+	ret = ret * (num / den) / 2;
+	//printf(" %d %.60f 0x%" print_64t "x\n", j, ret.to_double(),
+	//		to_u64(ret));
+
+	return ret;
+}
+
+int main(int argc, char *argv[])
+{
+	if (argc != 3) {
+		printf("Uso: %s <prec> <nterm>\n", argv[0]);
+		return 1;
+	}
+
+	prec = atoi(argv[1]);
+	int nterm = atoi(argv[2]);
+
+	/* Valor inicial, el del primer término */
+	numero n(prec, 1);
+
+	numero a_i(prec, 1);
+
+	/* Loop de la serie, nterm términos */
+	for (int i = 0; i < nterm; i++) {
+
+		numero antes = n;
+
+		a_i = a_i * b_i(i);
+		//printf("%.60f 0x%" print_64t "x\n", a_i.to_double(), to_u64(a_i));
+		
+		n = n + a_i;
+
+		if (n == antes)
+		{
+			printf("Sale por no sumar\n");
+			break;
+		}
+
+		/* XXX DEBUG - SACAR */
+		#if 0
+		printf("  %.60f 0x%" print_64t "x\n",
+				numerador.to_double(), to_u64(numerador));
+		printf("  %.60f 0x%" print_64t "x\n",
+				denominador.to_double(), to_u64(denominador));
+		printf("  ---\n");
+		#endif
+		//printf(" %d %.60f 0x%" print_64t "x\n", i, n.to_double(), to_u64(n));
+	}
+
+	printf("%.60f 0x%" print_64t "x\n", n.to_double(), to_u64(n));
+
+	return 0;
+}
+