http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48979

           Summary: FRACTION und EXPONENT return invalid results for
                    infinity/NaN
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: thenl...@users.sourceforge.net


program test_fractnan
    real, parameter :: pinfp = transfer(z'7F800000', 0.0)
    real, parameter :: ninfp = transfer(z'FF800000', 0.0)
    real, parameter :: nanp = transfer(z'7FD00000', 0.0)
    real, parameter :: zerop = 0.0
    real :: nan = nanp, pinf = pinfp, ninf = ninfp, zero = zerop

    print 100, zero,  zero,  fraction(zero),  fraction(zero),  exponent(zero)
    print 100, zerop, zerop, fraction(zerop), fraction(zerop), exponent(zerop)
    print 100, nan,   nan,   fraction(nan),   fraction(nan),   exponent(nan)
    print 100, nanp,  nanp,  fraction(nanp),  fraction(nanp),  exponent(nanp)
    print 100, ninf,  ninf,  fraction(ninf),  fraction(ninf),  exponent(ninf)
    print 100, ninfp, ninfp, fraction(ninfp), fraction(ninfp), exponent(ninfp)
    print 100, pinf,  pinf,  fraction(pinf),  fraction(pinf),  exponent(pinf)
    print 100, pinfp, pinfp, fraction(pinfp), fraction(pinfp), exponent(pinfp)
100 format (f10.5,1x,z8,1x,f10.5,1x,z8,1x,i11)
end program test_fractnan

Result:
   0.00000        0    0.00000        0           0
   0.00000        0    0.00000        0           0
       NaN 7FD00000        NaN 7FD00000           0
       NaN 7FD00000    0.00000        0           0
 -Infinity FF800000  -Infinity FF800000           0
 -Infinity FF800000        NaN 7FC00000 -2147483645
  Infinity 7F800000   Infinity 7F800000           0
  Infinity 7F800000        NaN 7FC00000 -2147483645

Expected result (-std=f2003):
   0.00000        0    0.00000        0           0
   0.00000        0    0.00000        0           0
       NaN 7FD00000        NaN 7FD00000  2147483647
       NaN 7FD00000        NaN 7FD00000  2147483647
 -Infinity FF800000  -Infinity FF800000  2147483647
 -Infinity FF800000  -Infinity FF800000  2147483647
  Infinity 7F800000   Infinity 7F800000  2147483647
  Infinity 7F800000   Infinity 7F800000  2147483647

Expected result (-std=f2008):
   0.00000        0    0.00000        0           0
   0.00000        0    0.00000        0           0
       NaN 7FD00000        NaN 7FD00000  2147483647
       NaN 7FD00000        NaN 7FD00000  2147483647
 -Infinity FF800000        NaN 7FC00000  2147483647
 -Infinity FF800000        NaN 7FC00000  2147483647
  Infinity 7F800000        NaN 7FC00000  2147483647
  Infinity 7F800000        NaN 7FC00000  2147483647

EXPONENT(X)
Fortran 2003/2008:
If X is an IEEE infinity or NaN, the result has the value HUGE (0).

FRACTION(X)
Fortran 2003:
If X is an IEEE infinity, the result is that infinity. If X is an IEEE NaN, the
result is that NaN.

Fortran 2008:
If X is an IEEE NaN, the result is that NaN. If X is an IEEE infinity, the
result is an IEEE NaN.

Bug 1:
The program does not compile without -fno-range-check.

Bug 2:
Different results are returned for a variables with values of NaN/Infinity and
compile-time constants NaN/Infinity.

Bug 3:
EXPONENT should be HUGE(0)=2147483647 for NaN/Infinity.

Reply via email to