AlmostEqual_r64 Function

public function AlmostEqual_r64(a, b) result(AisB)

\addtogroup SELF_SupportRoutines @{ \fn AlmostEqual Compares two floating point numbers and determines if they are equal (to machine precision).

This function is from Alg. 139 on pg. 359 of D.A. Kopriva, 2009, "Implementing Spectral Element Methods for Scientists and Engineers"

Usage :

Logical :: AisB
REAL(prec) :: a, b
....
AisB = AlmostEqual( a, b )

Parameters :

in a REAL(prec) scalar
in b REAL(prec) scalar
in AisB Logical .TRUE. IF a=b to machine precision
.FALSE. otherwise

@}

Arguments

TypeIntentOptionalAttributesName
real(kind=real64) :: a
real(kind=real64) :: b

Return Value logical


Called by

proc~~almostequal_r64~~CalledByGraph proc~almostequal_r64 AlmostEqual_r64 interface~almostequal AlmostEqual interface~almostequal->proc~almostequal_r64 proc~calculatelagrangepolynomials CalculateLagrangePolynomials proc~calculatelagrangepolynomials->interface~almostequal proc~calculateinterpolationmatrix CalculateInterpolationMatrix proc~calculateinterpolationmatrix->interface~almostequal

Contents

Source Code


Source Code

  function AlmostEqual_r64(a,b) result(AisB)

    implicit none
    real(real64) :: a,b
    logical :: AisB

    if(a == 0.0_real64 .or. b == 0.0_real64) then
      if(abs(a-b) <= epsilon(1.0_real64)) then
        AisB = .true.
      else
        AisB = .false.
      endif
    else
      if((abs(a-b) <= epsilon(1.0_real64)*abs(a)) .or. (abs(a-b) <= epsilon(1.0_real64)*abs(b))) then
        AisB = .true.
      else
        AisB = .false.
      endif
    endif

  endfunction AlmostEqual_r64