Back
//---------------------------------------------------------------------------
// created:  20040808  by N.V.Shokhirev
// modified: 200408930  by N.V.Shokhirev
// modified: 20060103 - switched to real
//---------------------------------------------------------------------------
#ifndef MatUtilsH
#define MatUtilsH

#include <math.h>
#define eps0 1.0e-9

//---------------------------------------------------------------------------

typedef double real;

// Macheps + 1.0 > 1.0
const real Macheps = 2.22044604925031E-16;  // for double

// SafeMacheps = 1024*Macheps + 1.0 > 1.0
const real SafeMacheps = 2.27373675443231744-13;  // for double

// SqrtMacheps = sqrt(2.22044604925031e-16)
const real SqrtMacheps = 1.4901161193848e-8;

// SafeMinreal > 0.0
const real MinReal = 4.94065645841247E-324;  // for double

const real SqrtMinReal = 2.222758749485E-162;  // for double

// SafeMinreal = 1024*Minreal
const real SafeMinReal = 5.05923221341436928e-321;

// VerySafeMinreal = 1048576*Minreal
const real VerySafeMinReal = 5.18065378653631e-318;

// Pascal square: x**2
real Sqr(real x); // { return (x*x); }

real sqr(real x); //  { return (x*x); }

// FORTRAN abs
real abs(real x); // { return ( (x >= 0.0) ? x : -x); }

int iabs(int x); // { return ( (x >= 0.0) ? x : -x); }

// FORTRAN min/max
real max1(real x1, real x2); // { return ( (x1 > x2) ? x1 : x2); }

real min1(real x1, real x2); // { return ( (x1 < x2) ? x1 : x2); }

int max0(int x1, int x2); // { return ( (x1 > x2) ? x1 : x2); }

int min0(int x1, int x2); // { return ( (x1 < x2) ? x1 : x2); }

real round1(real x); // { return floor(x+0.5);};

int round0(real x); // { return int(round1(x)); }

// Pascal signum
real Sign(real x); // Sign = 1 if x > 0; Sign = 0 if x is 0; Sign = -1 if x < 0;

int iSign (int x);

// FORTRAN signum
real sign(real x1, real x2); // { return ( x2 >= 0.0 ? abs(x1) : -abs(x1) ; }

real sign2(real a, real b);  // sign2 = sign

int isign (int x1, int x2); // { return ( x2 >= 0 ? iabs(x1) : -iabs(x1) ); }

int isign2 (int a, int b);  // isign2 = isign

// other sugnum functions
real sign0(real x); // sign1 = Sign

real sign1(real x); // {  if ( x < 0.0 ) { return -1.0; } else { return 1.0; };}

// safe sqrt: sqroot = sqrt(x + y)
real sqroot1(real x, real y);

// safe sqrt: sqroot2 = sqrt(x*x+y*y); functionally the same as pythag
real sqroot2(real x, real y);

// sqrt(a**2+b**2) without overflow or destructive underflow;
// EISPACK algorithm; functionally the same as sqroot2
real pythag(real a, real b);

// min/max of 3 variables
real max3(real x1, real x2, real x3); // { return max1(max1(x1,x3),x2); }

real min3(real x1, real x2, real x3); // { return min1(min1(x1,x3),x2); }

// if (abs(x2) > SafeMinReal) return x1/x2; else return 0.0;
real SafeDiv(real x1, real x2);

//   if ( abs(x)> eps) return x; else return 0.0;
real Zero(real x, real eps);

// float equal
bool Equal(real x1, real x2, real eps); // { return (fabs(x1-x2) < eps); };

#endif