------- Comment #2 from burnus at gcc dot gnu dot org  2007-11-22 16:11 -------
I believe there is indeed a bug in gfortran. The standard says that the "the
nearest different machine-representable number" is returned.

However, gfortran returns a number which is not representable (denormal or
smaller?) and rounded to zero (= same number).

Result (gfortran 4.3.0):
a) The program is wrongly rejected
b) With -fno-range-check, the wrong number is used. For the example the dump
shows:
   static real(kind=8) C.859 = 0.0;

The expected result is some denormal number like:
5.E-324, 4.9406564584124654E-324, 2.225073858507201E-308,
4.94065645841246544E-324, 4.940656458412465E-324.
(The ifort result of 2e-308 looks wrong in this regard as there is a nearer
number.)

gfortran 4.1.3 returns: 4.940656458412465E-324
gfortran 4.2.2 rejects it and has an ICE with -fno-range-check


Besides fixing this bug, we should also consider mentioning -fno-range-check in
the error message. (Though, in this case -fno-range-check would have concealed
the real bug.)


The Fortran 2003 standard states:

"NEAREST (X, S)
Description. Returns the nearest different machine-representable number in a
given direction.
  X shall be of type real.
  S shall be of type real and not equal to zero.
Result Characteristics. Same as X.
Result Value. The result has a value equal to the machine-representable number
distinct from X and nearest to it in the direction of the infinity with the
same sign as S.

NOTE 13.16 Unlike other floating-point manipulation functions, NEAREST operates
on machine-representable numbers rather than model numbers. On many systems
there are machine-representable numbers that lie between adjacent model
numbers."


-- 

burnus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |burnus at gcc dot gnu dot
                   |                            |org
OtherBugsDependingO|                            |32834
              nThis|                            |
   GCC host triplet|Linux i686                  |
           Keywords|                            |rejects-valid, wrong-code
      Known to fail|                            |4.2.2 4.3.0
      Known to work|                            |4.1.3
            Summary|problem with NEAREST        |[4.2, 4.3 Regression]
                   |intrinsic function          |NEAREST can return wrong
                   |                            |numbers


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

Reply via email to