Floating-point checks usually compare a difference against a tolerance instead of exact equality.

Program

Play the program to tighten or loosen the tolerance.

tolerance
tolerance_compare.f90
Replay: real traced execution (multi-file project)
program tolerance_compare_demo
    implicit none
    real :: expected
    real :: observed
    real :: tolerance
    real :: difference
    integer :: passed

    expected = 10.0
    observed = 9.9
    tolerance = 0.20
    difference = abs(expected - observed)
    passed = 0
    if (difference <= tolerance) passed = 1
    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
end program tolerance_compare_demo
program tolerance_compare_demo
    implicit none
    real :: expected
    real :: observed
    real :: tolerance
    real :: difference
    integer :: passed

    expected = 10.0
    observed = 9.9
    tolerance = 0.05
    difference = abs(expected - observed)
    passed = 0
    if (difference <= tolerance) passed = 1
    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
end program tolerance_compare_demo
program tolerance_compare_demo
    implicit none
    real :: expected
    real :: observed
    real :: tolerance
    real :: difference
    integer :: passed

    expected = 10.0
    observed = 9.9
    tolerance = 0.50
    difference = abs(expected - observed)
    passed = 0
    if (difference <= tolerance) passed = 1
    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
end program tolerance_compare_demo
  1. expected ← 10.0

    9expected = 10.010observed = 9.9
    values this step10.0expected
  2. observed ← 9.9

    9expected = 10.010observed = 9.911tolerance = 0.20
    values this step9.9observed
  3. tolerance ← 0.20

    10observed = 9.911tolerance = 0.2012difference = abs(expected - observed)
    values this step0.20tolerance
  4. difference ← 0.10

    11tolerance = 0.2012difference = abs(expected - observed)13passed = 0
    values this step0.10difference10.0expected9.9observed
  5. passed ← 0

    12difference = abs(expected - observed)13passed = 014if (difference <= tolerance) passed = 1
    values this step0passed
  6. passed ← 1

    13passed = 014if (difference <= tolerance) passed = 115print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
    values this step1passed.true.difference <= tolerance
  7. print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed

    14    if (difference <= tolerance) passed = 115    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed16end program tolerance_compare_demo
    output0.10 0.20 1
    values this step0.10difference0.20tolerance1passed
  1. expected ← 10.0

    9expected = 10.010observed = 9.9
    values this step10.0expected
  2. observed ← 9.9

    9expected = 10.010observed = 9.911tolerance = 0.05
    values this step9.9observed
  3. tolerance ← 0.05

    10observed = 9.911tolerance = 0.0512difference = abs(expected - observed)
    values this step0.05tolerance
  4. difference ← 0.10

    11tolerance = 0.0512difference = abs(expected - observed)13passed = 0
    values this step0.10difference10.0expected9.9observed
  5. passed ← 0

    12difference = abs(expected - observed)13passed = 014if (difference <= tolerance) passed = 1
    values this step0passed
  6. if (difference <= tolerance) passed = 1

    13passed = 014if (difference <= tolerance) passed = 115print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
    values this step.false.difference <= tolerance
  7. print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed

    14    if (difference <= tolerance) passed = 115    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed16end program tolerance_compare_demo
    output0.10 0.05 0
    values this step0.10difference0.05tolerance0passed
  1. expected ← 10.0

    9expected = 10.010observed = 9.9
    values this step10.0expected
  2. observed ← 9.9

    9expected = 10.010observed = 9.911tolerance = 0.50
    values this step9.9observed
  3. tolerance ← 0.50

    10observed = 9.911tolerance = 0.5012difference = abs(expected - observed)
    values this step0.50tolerance
  4. difference ← 0.10

    11tolerance = 0.5012difference = abs(expected - observed)13passed = 0
    values this step0.10difference10.0expected9.9observed
  5. passed ← 0

    12difference = abs(expected - observed)13passed = 014if (difference <= tolerance) passed = 1
    values this step0passed
  6. passed ← 1

    13passed = 014if (difference <= tolerance) passed = 115print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed
    values this step1passed.true.difference <= tolerance
  7. print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed

    14    if (difference <= tolerance) passed = 115    print '(F0.2, 1X, F0.2, 1X, I0)', difference, tolerance, passed16end program tolerance_compare_demo
    output0.10 0.50 1
    values this step0.10difference0.50tolerance1passed
difference `abs(expected - observed)` measures the gap between values.
tolerance The tolerance records how much difference is acceptable.
near comparison The result passes when the difference is within tolerance.