|
Prev
| Next
|
|
|
|
|
|
num_limits.cpp |
Headings |
@(@\newcommand{\W}[1]{ \; #1 \; }
\newcommand{\R}[1]{ {\rm #1} }
\newcommand{\B}[1]{ {\bf #1} }
\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }
\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }
\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }
\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
This is cppad-20221105 documentation. Here is a link to its
current documentation
.
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 check_infinity(void)
{ bool ok = true;
Float inf = CppAD::numeric_limits<Float>::infinity();
Float hun = Float(100);
Float tmp = Float(0);
tmp = inf + hun;
ok &= inf == tmp;
tmp = inf - inf;
ok &= CppAD::isnan( tmp );
return ok;
}
}
bool num_limits(void)
{ bool ok = true;
ok &= check_epsilon();
ok &= check_min();
ok &= check_max();
ok &= check_nan();
ok &= check_digits10();
ok &= check_infinity();
return ok;
}
Input File: example/general/num_limits.cpp