author | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2010-09-05 22:38:17 UTC |
committer | Alberto Bertogli
<albertito@blitiri.com.ar> 2010-09-06 21:26:42 UTC |
parent | ab0c74c16f99f886b212f048f1d1363b23807903 |
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; +} +