author | Alberto Bertogli
<albertito@blitiri.com.ar> 2010-08-31 00:54:45 UTC |
committer | Alberto Bertogli
<albertito@blitiri.com.ar> 2010-08-31 00:54:45 UTC |
parent | 37168e32ab200e23ef1085db347574b4bb81dce0 |
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; +} +