This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/34230] Expressions of parameters evaluated with too high precision



------- Comment #7 from kargl at gcc dot gnu dot org  2007-11-28 19:06 -------
(In reply to comment #6)
> I consider this a bug. I have to check, but I think that the IEEE rules are
> clear, even though they are not mandatory until we introduce the corresponding
> standard modules. The calculation of y does overflow, and while we can debate
> on what the behaviour of -fno-range-check should be, I think there is a strong
> case for doing the same thing that a) other compilers do, b) IEEE mandates, c)
> is what would happen if it occurred at runtime.

a) Do other compilers have an equivalent to -fno-range-check?
b) The Fortran 95 standard is silent with respect to IEEE-754,
   and the Fortran 2003 standard only considers IEEE-754 through
   the explicit use of an intrinsic module.
c) Are you suggesting that -ffpe-trap=invalid,overflow,zero should be
   the default runtime behavior (to match gfortran's default 
   -frange-check behavior)?

If you want to be pedantic, this code is invalid

   real, parameter :: y = exp(log(huge(y))+20)

because (See 13.14)

   A program is prohibited from invoking an intrinsic procedure under
   circumstances where a value to be returned in a subroutine argument
   or function result is outside the range of values representable by
   objects of the specified type and type parameters.

unless you're claiming +Inf is in the range of values representable by
a real (in which case, you can against remove range checking).  If +Inf
is a representable value, you need to go fix the IO subsystem to read
+Inf (and NaN).  

   character(len=60) str
   real inf, nan
   integer, parameter :: i = 2139095040, j = 2141192192
   inf = transfer(i,inf)  ! Legal, but non-portable
   nan = transfer(j,nan)  ! Legal, but non-portable
   write(str, *) inf, nan
   inf = 0
   nan = 0
   read(str, *) inf, nan
   print *, inf, nan
   end

troutmask:sgk[246] ./z
At line 9 of file a.f90
Fortran runtime error: Bad real number in item 1 of list input

You'll also need to fix modules to properly handle +Inf and NaN.

   module except
   real, parameter :: inf = 1./0., nan = 0./0.
   end module

   program a
     use except
     print *, inf, nan
   end program a

troutmask:sgk[251] gfc -o z -fno-range-check a.f90
troutmask:sgk[252] ./z
   0.000000       0.000000    


-- 

kargl at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|kargl at gcc dot gnu dot org|sgk at troutmask dot apl dot
                   |                            |washington dot edu


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]