git » metnum-tp1.git » master » tree

[master] / aritmetica.hpp

#ifndef _ARITMETICA_HPP
#define _ARITMETICA_HPP

#include <stdint.h>	// uint64_t


/* Recorta la precision del double dado, devuelve un double "recortado". */
double trunc(int prec, double n);

/* Redondea el doble dado fijadonse si el bit prec + 1 de la mantisa es mayor o
 * no a cero */
double round_up(int prec, double n);

class numero
{
public:
	numero(int prec = 52, double real = 0);

	// Aritmeticas
	numero operator + (const numero &b) const;
	numero operator - (const numero &b) const;
	numero operator * (const numero &b) const;
	numero operator / (const numero &b) const;
	numero operator + (const double &b) const;
	numero operator - (const double &b) const;
	numero operator * (const double &b) const;
	numero operator / (const double &b) const;

	// Unario
	//numero operator - () const;

	// AsignaciĆ³n
	numero operator = (double n);
	numero operator = (numero n);

	bool operator == (numero n);

	// Cast a double
	//operator double() const;
	double to_double() const;

	// Devolver la precision
	int get_prec() const;

	/* Metodo usado para aproximar a la presicion pedida (por default es
	 * truncamiento) */
	static double (*aprox_m) (int prec, double n);

private:
	// Precision
	int prec;

	// Double utilizado para almacenar y operar, siempre va a estar en la
	// precision de prec
	double real;
};

/* Operadores para poder hacer   double <op> numero   y obtener un numero */
numero operator + (const double &a, const numero &b);
numero operator - (const double &a, const numero &b);
numero operator * (const double &a, const numero &b);
numero operator / (const double &a, const numero &b);

/* Devuelve un uint64_t con el contenido del double, porque el cast no es tan
 * pavote. */
uint64_t to_u64(double n);
uint64_t to_u64(numero n);

/* Devuelve un double con el contenido del uint64_t, porque el cast no es tan
 * pavote. */
double to_double(uint64_t n);


#endif // ifndef _ARITMETICA_HPP