Back
//---------------------------------------------------------------------------
// created:  20040808  by N.V.Shokhirev
// modified: 20050809  by N.V.Shokhirev
// modified: 20060103 - switched to real
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "MatUtils.h"

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

#pragma package(smart_init)

// Pascal square
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)
{
  if ( x > 0.0 ) { return 1.0; }
  else if ( x < 0.0 ) { return -1.0; }
  else { return 0.0; };
}

int iSign (int x)
{
  if (x > 0) { return 1; }
  else if (x == 0)  { return 0; }
  else { return -1; };
}

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

real sign2(real a, real b)   // sign2 = sign
{
  if ( b < 0.0 ) { return -abs(a); }
  else { return abs(a); };
}

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

int isign2 (int a, int b)    // isign2 = isign
{
  if ( b < 0 ) { return -iabs(a); }
  else { return iabs(a); };
}

// other sugnum functions
real sign0(real x)
{
  if ( x > 0.0 ) { return 1.0; }
  else if ( x < 0.0 ) { return -1.0; }
  else { return 0.0; };
}

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

// safe sqrt: sqroot = sqrt(x + y)
real sqroot1(real x, real y)
{
  if ((x + y) <= 0) { return 0.0; }
  else if (x > y) { return sqrt(x)*sqrt(1.0 + y/x); }
  else { return sqrt(y)*sqrt(1.0 + x/y); };
}

// safe sqrt: sqroot2 = sqrt(x*x+y*y); functionally the same as pythag
real sqroot2(real x, real y)
{
  if (abs(x) > abs(y)) { return abs(x)*sqrt(1.0+sqr(y/x)); }
  else if (abs(y) == 0.0) { return 0.0; }
  else { return abs(y)*sqrt(1.0+sqr(x/y)); };
}

// finds dsqrt(a**2+b**2) without overflow or destructive underflow;
// EISPACK algorithm; functionally the same as sqroot2
real pythag(real a, real b)
{
  real p, r;
  p = max1(abs(a),abs(b));
  if (p == 0.0) { return 0.0; };
  r = min1(abs(a),abs(b));
  if (r < SqrtMinReal*p) { return p; }
  else { return p*sqrt(1.0 + sqr(r/p)); };
}

// 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)
{ return ( (abs(x2) > SafeMinReal) ? x1/x2 : 0.0 ); }

//   if ( abs(x)> eps) return x; else return 0.0;
real Zero(real x, real eps)
{ return ( (abs(x)> eps) ? x : 0.0 ); }

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