| Prev | Next |  |  |  |  |  | num_limits.cpp | Headings

Numeric Limits: Example and Test
`

    # 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;
    }

`

Input File: example/general/num_limits.cpp