Actual source code: mathclose.c

      1: #include <petscsys.h>

      3: /*@C
      4:   PetscIsCloseAtTol - Returns whether the two `PetscReal` numbers
      5:   are close at a given relative and absolute tolerances <https://www.python.org/dev/peps/pep-0485/>.

      7:   Input Parameters:
      8: + a    - first floating point number
      9: . b    - second floating point number
     10: . rtol - relative tolerance
     11: - atol - absolute tolerances

     13:   Level: beginner

     15: .seealso: `PetscIsCloseAtTolScalar()`, `PetscEqualReal()`, `PetscEqualScalar()`
     16: @*/
     17: PetscBool PetscIsCloseAtTol(PetscReal a, PetscReal b, PetscReal rtol, PetscReal atol)
     18: {
     19:   PetscReal diff;
     20:   /* NaN is not considered close to any other value, including NaN */
     21:   if (PetscIsNanReal(a) || PetscIsNanReal(b)) return PETSC_FALSE;
     22:   /* Fast path for exact equality or two infinities of same sign */
     23:   if (a == b) return PETSC_TRUE;
     24:   /* Handle two infinities of opposite sign */
     25:   if (PetscIsInfReal(a) || PetscIsInfReal(b)) return PETSC_FALSE;
     26:   /* Cannot error if tolerances are negative */
     27:   rtol = PetscAbsReal(rtol);
     28:   atol = PetscAbsReal(atol);
     29:   /* The regular check for difference within tolerances */
     30:   diff = PetscAbsReal(b - a);
     31:   return ((diff <= PetscAbsReal(rtol * b)) || (diff <= PetscAbsReal(rtol * a)) || (diff <= atol)) ? PETSC_TRUE : PETSC_FALSE;
     32: }