#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