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: [email protected]
ReportedBy: [email protected]
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.