! { dg-do run } ! { dg-additional-options "-fno-range-check" } ! ! Check handling of special values by FRACTION, EXPONENT, ! SPACING, RRSPACING and SET_EXPONENT. program test implicit none real, parameter :: inf = 2 * huge(0.) real, parameter :: nan = 0. / 0. real, volatile :: x x = 0. call check_positive_zero(fraction(x)) if (exponent(x) /= 0) STOP 1 if (spacing(x) /= spacing(tiny(x))) STOP 2 call check_positive_zero(rrspacing(x)) call check_positive_zero(set_exponent(x,42)) x = -0. call check_negative_zero(fraction(x)) if (exponent(x) /= 0) STOP 3 if (spacing(x) /= spacing(tiny(x))) STOP 4 call check_positive_zero(rrspacing(x)) call check_negative_zero(set_exponent(x,42)) x = inf if (.not. isnan(fraction(x))) STOP 5 if (exponent(x) /= huge(0)) STOP 6 if (.not. isnan(spacing(x))) STOP 7 if (.not. isnan(rrspacing(x))) STOP 8 if (.not. isnan(set_exponent(x, 42))) STOP 9 x = -inf if (.not. isnan(fraction(x))) STOP 10 if (exponent(x) /= huge(0)) STOP 11 if (.not. isnan(spacing(x))) STOP 12 if (.not. isnan(rrspacing(x))) STOP 13 if (.not. isnan(set_exponent(x, 42))) STOP 14 x = nan if (.not. isnan(fraction(x))) STOP 15 if (exponent(x) /= huge(0)) STOP 16 if (.not. isnan(spacing(x))) STOP 17 if (.not. isnan(rrspacing(x))) STOP 18 if (.not. isnan(set_exponent(x, 42))) STOP 19 contains subroutine check_positive_zero(x) use ieee_arithmetic implicit none real, value :: x if (ieee_class (x) /= ieee_positive_zero) STOP 20 end subroutine check_negative_zero(x) use ieee_arithmetic implicit none real, value :: x if (ieee_class (x) /= ieee_negative_zero) STOP 21 end end