/** @(#) 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------------------------------------------------------------------------