/** @(#) mathpos/mathpos.cpp */
#include "mathpos.h"

// array----------------------------------------------------------------------
// vector---------------------------------------------------------------------
/** Convierte un vector de long en float. */
void vectorLongToFloat(long *pLong, float *pFloat, int count) {
	int i;
        for (i = 0; i < count; ++i) {
        	pFloat[i] = static_cast<float>( pLong[i] );
        }
}

/** Solo usarlo con tipos numericos: int, long, float, double. */
//template <class TC>
void vectorToZero(long *pVector, int count) {
	int i;
        for (i = 0; i < count; ++i) {
        	pVector[i] = 0L;
        }
}

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


/** Si alguno es casi cero, la comparacion es absoluta. En otro caso,
* la diferencia es relativa. Usa SQRT_MACHEPS.
* @return true: Diferencia relativa no significativa. false: otro caso. */
// No hacerlo template, float se convierte automaticamente
bool areAlmostEqual(double a, double b) {
	// Caso 0.0 == 0.0
	double absDiff;
        // Si alguno es casi cero
        if ((fabs(a) < SQRT_MACHEPS) || (fabs(b) < SQRT_MACHEPS)) {
		absDiff = fabs(b - a);	// diferencia absoluta
        } else {
		absDiff = fabs( (b - a) / b);	// diferencia relativa
        }
	return ( (absDiff < SQRT_MACHEPS) ? true : false);
}

/** Calcula la precision actual de la computadora. */
double calculateMachineps() {
	double macheps = 1.0;
        do {
        	macheps /= 2.0;
        } while ( (1.0 + macheps) != 1.0);
        macheps *= 2.0;
        return macheps;
}

/** computes shift value (mu_c) used in modified newton method
* to build Hc = (Nabla^2)(f)(xc) + mu_c * I
* @param l Lower boundaries for the eigenvalues of (Nabla^2)(f)(xc).
* @param u Upper boundaries for the eigenvalues of (Nabla^2)(f)(xc). */
double calculateMu(double l, double u ) {

   double m;

   if ( fabs(l) >= fabs(u) ) {
      m = fabs(l) + MACHEPS;
   } else {
      m = fabs(u) + MACHEPS;
   }
   return m;
}

//template <class TObj>
// constructor, ~, friend-----------------------------------------------------
/* Constructor predeterminado. */
/** Construye. */

/* Destructor predeterminado. */
/** Libera recursos. */

// operator-------------------------------------------------------------------

// public---------------------------------------------------------------------

// private--------------------------------------------------------------------

/**
*
* @param
* @param
* @return
* @see paq1.paq2.MyClass#MyMethod(int,Object)
* @throws Exception
*/
// Fin------------------------------------------------------------------------