#include "libscl.h"
using namespace scl;
using namespace std;

/*

The following is in "sclfuncs.h", which is included in "libscl.h"

inline bool     IsFinite(REAL x) 
{
  return (x == x) && (x < REAL_MAX) && (x > -REAL_MAX);
}

*/

int main(int argc, char** argp, char** envp)
{

  REAL x,y,z,v,r,s;

  v = 1.0;
  y = 0.0;

  r  = 1.0;
  s  = 1.0;

  z = sqrt(r) - sqrt(s);
  z = fabs(z);

  x=y/z;

  cout << '\n';

  cout << "  COMPUTED VALUE      CORRECT VALUE\n";

  cout << '\n';

  cout << "    x =" << fmt('f',9,6,x) << "        x =     NaN" << '\n';
  cout << "    v =" << fmt('f',9,6,v) << "        v = 1.00000" << '\n';

  cout << '\n';

  cout << " IsFinite(x) = " <<     IsFinite(x) << "    IsFinite(x) = F" << '\n';

  cout << '\n';

  cout << "    (x == v) = " << (x == v) << "      (x == v) =  F" << '\n';
  cout << "    (x <  v) = " << (x <  v) << "      (x <  v) =  F" << '\n';
  cout << "    (x <= v) = " << (x <= v) << "      (x <= v) =  F"<< '\n';
  cout << "    (x >  v) = " << (x >  v) << "      (x >  v) =  F" << '\n';
  cout << "    (x >= v) = " << (x >= v) << "      (x >= v) =  F" << '\n';
  cout << "    (x != v) = " << (x != v) << "      (x != v) =  T" << '\n';

  cout << '\n';

  cout << "    (x == x) = " << (x == x) << "      (x == x) =  F" << '\n';
  cout << "    (x <  x) = " << (x <  x) << "      (x <  x) =  F" << '\n';
  cout << "    (x <= x) = " << (x <= x) << "      (x <= x) =  F" << '\n';
  cout << "    (x >  x) = " << (x >  x) << "      (x >  x) =  F" << '\n';
  cout << "    (x >= x) = " << (x >= x) << "      (x >= x) =  F" << '\n';
  cout << "    (x != x) = " << (x != x) << "      (x != x) =  T" << '\n';

  x=-x;

  cout << '\n';

  cout << "    x =" << fmt('f',9,6,x) << "        x =    -NaN" << '\n';
  cout << "    v =" << fmt('f',9,6,v) << "        v = 1.00000" << '\n';

  cout << '\n';

  cout << " IsFinite(x) = " <<     IsFinite(x) << "    IsFinite(x) = F" << '\n';

  cout << '\n';

  cout << "    (x == v) = " << (x == v) << "      (x == v) =  F" << '\n';
  cout << "    (x <  v) = " << (x <  v) << "      (x <  v) =  F" << '\n';
  cout << "    (x <= v) = " << (x <= v) << "      (x <= v) =  F"<< '\n';
  cout << "    (x >  v) = " << (x >  v) << "      (x >  v) =  F" << '\n';
  cout << "    (x >= v) = " << (x >= v) << "      (x >= v) =  F" << '\n';
  cout << "    (x != v) = " << (x != v) << "      (x != v) =  T" << '\n';

  cout << '\n';

  cout << "    (x == x) = " << (x == x) << "      (x == x) =  F" << '\n';
  cout << "    (x <  x) = " << (x <  x) << "      (x <  x) =  F" << '\n';
  cout << "    (x <= x) = " << (x <= x) << "      (x <= x) =  F" << '\n';
  cout << "    (x >  x) = " << (x >  x) << "      (x >  x) =  F" << '\n';
  cout << "    (x >= x) = " << (x >= x) << "      (x >= x) =  F" << '\n';
  cout << "    (x != x) = " << (x != x) << "      (x != x) =  T" << '\n';

  cout << '\n';

  x = exp(REAL_MAX);

  cout << "    x =" << fmt('f',9,6,x) << "        x =     Inf" << '\n';

  cout << '\n';

  cout << " IsFinite(x) = " <<     IsFinite(x) << "    IsFinite(x) = F" << '\n';

  cout << '\n';

  cout << "    (x == x) = " << (x == x)     << "      (x == x) =  T" << '\n';
  cout << "    (x != x) = " << (x != x)     << "      (x != x) =  F" << '\n';
  cout << "  (x<REAL_MAX)=" << (x<REAL_MAX) << "     (x<REAL_MAX)=F" << '\n';
  cout << "  (x>REAL_MAX)=" << (x>REAL_MAX) << "     (x>REAL_MAX)=T" << '\n';

  x = -exp(REAL_MAX);

  cout << '\n';

  cout << "    x =" << fmt('f',9,6,x) << "        x =    -Inf" << '\n';

  cout << '\n';

  cout << " IsFinite(x) = " <<     IsFinite(x) << "    IsFinite(x) = F" << '\n';

  cout << '\n';

  cout << "    (x == x) = " << (x == x)      << "      (x == x) =  T" << '\n';
  cout << "    (x != x) = " << (x != x)      << "      (x != x) =  F" << '\n';
  cout << " (x<-REAL_MAX)=" << (x<-REAL_MAX) << "    (x<-REAL_MAX)=T" << '\n';
  cout << " (x>-REAL_MAX)=" << (x>-REAL_MAX) << "    (x>-REAL_MAX)=F" << '\n';

  return 0;
}












