The previous Gromacs values were a factor 2 too tight. While
we're at it, we also added float modifiers to the single-precision
constants, increased the accuracy in the double max/min values,
and improved the least significant bit in one of the single-precision
values. The previous relative accuracies for the PME correction
analytical approximations where set fairly arbitrary by dividing a
tightly chose constant with GMX_REAL_EPS, and since this is now a
larger number the unit test tolerance for those corrections has been
increased slightly to avoid triggering false failures.
Fixes #1356.
Change-Id: If29d2ff4141d86fd019e0dbdbfb7737ead28c3d4
#define NO_ATID (atom_id)(~0) /* Use this to indicate invalid atid */
/*! \brief Double precision accuracy */
#define NO_ATID (atom_id)(~0) /* Use this to indicate invalid atid */
/*! \brief Double precision accuracy */
-#define GMX_DOUBLE_EPS 1.11022302E-16
+#define GMX_DOUBLE_EPS 2.2204460492503131e-16
/*! \brief Maximum double precision value - reduced 1 unit in last digit for MSVC */
/*! \brief Maximum double precision value - reduced 1 unit in last digit for MSVC */
-#define GMX_DOUBLE_MAX 1.79769312E+308
+#define GMX_DOUBLE_MAX 1.7976931348623157e+308
/*! \brief Minimum double precision value */
/*! \brief Minimum double precision value */
-#define GMX_DOUBLE_MIN 2.22507386E-308
+#define GMX_DOUBLE_MIN 2.2250738585072014e-308
/*! \brief Single precision accuracy */
/*! \brief Single precision accuracy */
-#define GMX_FLOAT_EPS 5.96046448E-08
+#define GMX_FLOAT_EPS 1.19209290e-07F
/*! \brief Maximum single precision value - reduced 1 unit in last digit for MSVC */
/*! \brief Maximum single precision value - reduced 1 unit in last digit for MSVC */
-#define GMX_FLOAT_MAX 3.40282346E+38
+#define GMX_FLOAT_MAX 3.40282346E+38F
/*! \brief Minimum single precision value */
/*! \brief Minimum single precision value */
-#define GMX_FLOAT_MIN 1.17549435E-38
+#define GMX_FLOAT_MIN 1.175494351E-38F
/* Check whether we already have a real type! */
/* Check whether we already have a real type! */
{
// Pme correction only needs to be ~1e-6 accuracy single, 1e-10 double
#ifdef GMX_DOUBLE
{
// Pme correction only needs to be ~1e-6 accuracy single, 1e-10 double
#ifdef GMX_DOUBLE
- setUlpTol((gmx_int64_t)(1e-10/GMX_REAL_EPS));
+ setUlpTol((gmx_int64_t)(5e-10/GMX_REAL_EPS));
- setUlpTol((gmx_int64_t)(1e-6/GMX_REAL_EPS));
+ setUlpTol((gmx_int64_t)(5e-6/GMX_REAL_EPS));
#endif
setRange(0.15, 4);
#endif
setRange(0.15, 4);
{
// Pme correction only needs to be ~1e-6 accuracy single, 1e-10 double
#ifdef GMX_DOUBLE
{
// Pme correction only needs to be ~1e-6 accuracy single, 1e-10 double
#ifdef GMX_DOUBLE
- setUlpTol((gmx_int64_t)(1e-10/GMX_REAL_EPS));
+ setUlpTol((gmx_int64_t)(5e-10/GMX_REAL_EPS));
- setUlpTol((gmx_int64_t)(1e-6/GMX_REAL_EPS));
+ setUlpTol((gmx_int64_t)(5e-6/GMX_REAL_EPS));
#endif
setRange(0.15, 4);
setAbsTol(GMX_REAL_EPS);
#endif
setRange(0.15, 4);
setAbsTol(GMX_REAL_EPS);