|   | Prev | Next | num_limits.cpp | Headings | 
# ifdef _MSC_VER
// Supress Microsoft compiler warning about possible loss of precision,
// in the constructors (when converting to std::complex<float>)
//     Float one = 1
//     Float two = 2
// 1 and 2 are small enough so no loss of precision when converting to float.
# pragma warning(disable:4244)
# endif
# include <cppad/cppad.hpp>
# include <complex>
namespace {
     typedef CppAD::AD<double> Float;
     //
     // -----------------------------------------------------------------
     bool check_epsilon(void)
     {     bool ok    = true;
          Float eps   = CppAD::numeric_limits<Float>::epsilon();
          Float eps2  = eps / 2.0;
          Float check = 1.0 + eps;
          ok         &= 1.0 !=  check;
          check       = 1.0 + eps2;
          ok         &= 1.0 == check;
          return ok;
     }
     // -----------------------------------------------------------------
     bool check_min(void)
     {     bool ok     = true;
          Float min   = CppAD::numeric_limits<Float>::min();
          Float eps   = CppAD::numeric_limits<Float>::epsilon();
          //
          Float match = (min / 100.) * 100.;
          ok         &= fabs(match / min - 1.0)  > 3.0 * eps;
          //
          match       = (min * 100.) / 100.;
          ok         &= fabs(match / min - 1.0)  < 3.0 * eps;
          return ok;
     }
     // -----------------------------------------------------------------
     bool check_max(void)
     {     bool ok     = true;
          Float max   = CppAD::numeric_limits<Float>::max();
          Float eps   = CppAD::numeric_limits<Float>::epsilon();
          //
          Float match = (max * 100.) / 100.;
          ok         &= fabs(match / max - 1.0) > 3.0 * eps;
          //
          match       = (max / 100.) * 100.;
          ok         &= fabs(match / max - 1.0) < 3.0 * eps;
          return ok;
     }
     // -----------------------------------------------------------------
     bool check_nan(void)
     {     bool ok     = true;
          Float nan   = CppAD::numeric_limits<Float>::quiet_NaN();
          ok         &= nan != nan;
          return ok;
     }
     // -----------------------------------------------------------------
     bool check_digits10(void)
     {     bool ok     = true;
          Float neg_log_eps =
               - log10( CppAD::numeric_limits<Float>::epsilon() );
          int ceil_neg_log_eps =
               Integer( neg_log_eps );
          ok &= ceil_neg_log_eps == CppAD::numeric_limits<Float>::digits10;
          return ok;
     }
}
bool num_limits(void)
{     bool ok = true;
     ok &= check_epsilon();
     ok &= check_min();
     ok &= check_max();
     ok &= check_nan();
     ok &= check_digits10();
     return ok;
}