/** @(#) mathpos/mathpos.h */
/** 
* Operaciones matematicas: aritmeticas, vectores, arreglos.
* Conversiones numericas.
* @author Omar Posada Villarreal
* @version 1.2, 24/04/2002 inline
* @version 1.1, 02/03/2002
* @version 1.0, 19/02/2002
*/
#ifndef MATHPOS_H
#define MATHPOS_H
//----------------------------------------------------------------------------
#include "../utilpos/interfacepos.h"
#include <iomanip>	//setprecision()
#include <sstream>	// toString()
#include <algorithm>	//max
#include <cmath>

#include <iostream>
#include <string>
#include <stdexcept>	// runtime_exception
using namespace std;

/** Precision de la computadora (Machine Epsilon). */
const double MACHEPS = 1.0842021725e-19;

/** Frontera practica con la mitad de digitos. Raiz de Machine Epsilon. */
const double SQRT_MACHEPS = 3.2927225399e-10;

// array----------------------------------------------------------------------
// vector---------------------------------------------------------------------
void vectorLongToFloat(long *pLong, float *pFloat, int count);

//template <class TC>
//void vectorToZero(TC pVector[], int count);
void vectorToZero(long *pVector, int count);

// math-----------------------------------------------------------------------

double calculateMachineps();
bool areAlmostEqual(double a, double b);
double calculateMu(double l, double u );

// No usar toString por conflicto de nombres
inline string toStr(bool x) {
	return (x ? "true" : "false");
}


// Los templates solo pueden estar en *.h, si estan en *.cpp no enlaza
/**
* Obtiene el signo.
* @param x De donde se sacara el signo.
* @return
*	-1: Negativo. Si (-infinity, 0) (se excluye el cero)
*	1: Positivo. Si [0, +infinity)
* @version 08/03/2002
*/
template <class TC>
inline TC sign(TC &x) {
        return static_cast<TC>( (x < static_cast<TC>(0.0)) ? -1 : 1 );
}

/** @return true: x esta en el rango (-MACHEPS, +MACHEPS). false: contrario. */
// No usar template <class TC>, float se convierte a double automatico
inline bool isAlmostZero(double x) {
	return ((x > -MACHEPS) && (x < MACHEPS)) ? true :  false;
}

/**
* Operaciones matematicas: aritmeticas, vectores, arreglos.
* @author Omar Posada Villarreal
* @version 1.0, 19/02/2002
*/
//template <class TC>
/*class MathPos {
public:
	// Constructor predeterminado
	// Destructor predeterminado



private:
};
*/

/** Eleva al cuadrado. */
template <class TC>
inline TC square(TC &x) {
        return x * x;
}

/** Eleva al cuadrado. */
// Redundancia por conflicto de nombre con ImagePos
template <class TC>
inline TC MathPos_square(TC &x) {
        return x * x;
}

/** Para int, digits = 0.
* @return Cadena con formato fijo, con decimales fijo precision. */
template <class TC>
inline string toString(TC &x, int digits = 4) {
	// optimizar con scanf
	ostringstream outStr;
        outStr << setiosflags(ios::fixed) << setprecision(digits) << x;
	return outStr.str();
}

/** Para int, digits = 0.
* @return Cadena con formato fijo, con decimales fijo precision. */
template <class TC>
inline char *toChar(TC &x, int digits = 4) {
	// optimizar con scanf
	ostringstream outStr;
        outStr << setiosflags(ios::fixed) << setprecision(digits) << x;
	return const_cast<char *>(outStr.str().data());
}

//----------------------------------------------------------------------------
#endif
// Fin------------------------------------------------------------------------