git » metnum-tp1.git » commit 1c9a70f

Agregar método binomial

author Alberto Bertogli
2010-08-31 00:54:45 UTC
committer Alberto Bertogli
2010-08-31 00:54:45 UTC
parent 37168e32ab200e23ef1085db347574b4bb81dce0

Agregar método binomial

Es muy feo ya que cuando crece oscila, seguro vale la pena despues hacer una
nueva variante con mejores cuentas.

Makefile +8 -2
binomial.cpp +61 -0

diff --git a/Makefile b/Makefile
index f0235a6..47639f7 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CXXFLAGS += -Wall -std=c++98 -pedantic -Wno-long-long
 
 OBJS = aritmetica.o
 
-default: calc babilonio
+default: calc babilonio binomial
 
 all: default
 
@@ -13,6 +13,12 @@ calc: $(OBJS) calc.o
 babilonio: $(OBJS) babilonio.o
 	$(CXX) $(CXXFLAGS) $^ -o $@
 
+binomial: $(OBJS) binomial.o
+	$(CXX) $(CXXFLAGS) $^ -o $@
+
 clean:
-	rm -f $(OBJS) calc.o calc babilonio.o babilonio
+	rm -f $(OBJS)
+	rm -f calc.o calc
+	rm -f babilonio.o babilonio
+	rm -f binomial.o binomial
 
diff --git a/binomial.cpp b/binomial.cpp
new file mode 100644
index 0000000..bc4c0ad
--- /dev/null
+++ b/binomial.cpp
@@ -0,0 +1,61 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "aritmetica.hpp"
+
+static double factorial(unsigned int n)
+{
+	double res = 1;
+	for (unsigned int i = 1; i <= n; i++) {
+		res *= i;
+	}
+	return res;
+}
+
+int main(int argc, char *argv[])
+{
+	if (argc != 3) {
+		printf("Uso: %s <prec> <niters>\n", argv[0]);
+		return 1;
+	}
+
+	int prec = atoi(argv[1]);
+	int niters = atoi(argv[2]);
+
+	/* Valor inicial, el del primer término */
+	numero n(prec, 1);
+
+	/* Loop de la serie, niters términos */
+	for (int i = 1; i <= niters; i++) {
+
+		/* numerador: 1/2 (1/2 - 1) (1/2 - 2) ...
+		 * hasta (1/2 - i - 1) */
+		numero unmedio(prec, 0.5);
+		numero numerador = unmedio;
+		for (double j = 1; j < i; j++) {
+			numerador = numerador * (unmedio - j);
+		}
+
+		/* denominador: factorial(i) */
+		numero denominador(prec, factorial(i));
+
+		/* Acumulamos el término */
+		n = n + numerador / denominador;
+
+		/* XXX DEBUG - SACAR */
+		#if 0
+		printf("  %.60f 0x%lx\n",
+				(double) numerador, to_u64(numerador));
+		printf("  %.60f 0x%lx\n",
+				(double) denominador, to_u64(denominador));
+		printf("  ---\n");
+		#endif
+		//printf(" %d %.60f 0x%lx\n", i, (double) n, to_u64(n));
+	}
+
+	printf("%.60f 0x%lx\n", (double) n, to_u64(n));
+
+	return 0;
+}
+