Related articles |
---|
IEEE arithmetic handling jim@meiko.co.uk (1992-11-11) |
Re: IEEE arithmetic handling tmb@arolla.idiap.ch (1992-11-16) |
Re: IEEE arithmetic handling eggert@twinsun.com (1992-11-16) |
Re: IEEE arithmetic handling bill@amber.csd.harris.com (1992-11-16) |
Re: IEEE arithmetic handling jlg@cochiti.lanl.gov (1992-11-17) |
Re: IEEE arithmetic handling eggert@twinsun.com (1992-11-17) |
Re: IEEE arithmetic handling tmb@arolla.idiap.ch (1992-11-18) |
[5 later articles] |
Newsgroups: | comp.compilers |
From: | jim@meiko.co.uk (James Cownie) |
Organization: | Compilers Central |
Date: | Wed, 11 Nov 1992 10:31:40 GMT |
Keywords: | arithmetic, question |
In comp.lang.fortran jlg@cochiti.lanl.gov (J. Giles) writes:
|> Unfortunately, the Fortran standard does not conform to
|> IEEE (in fact, it conflicts with it in some places - like with regard
|> to negative zero). And the Fortran standard does not require the same
|> conversion accuracy as the IEEE floating point standard.
This is a less significant difference than some of the others, in
particular Fortran definition of NINT and ANINT directly conflicts with
the IEEE definitions of the same functions.
The Fortran definition could be written as
INTEGER FUNCTION NINT(X)
IF (X > 0.0) THEN
NINT = INT(X+0.5)
ELSE
NINT = INT(X-0.5)
ENDIF
END
IEEE (in round nearest mode, which is the default) specifies round even,
so
IEEENINT(1.5) == 2.0 (as Fortran NINT)
BUT IEEENINT(2.5) == 2.0 (Fortran gives 3.0)
Another area where IEEE seems never to be implemented correctly by
compilers is in the handling of Not a Numbers (NaNs).
In the IEEE standard NaNs are values which can be encoded into a floating
point variable, which represent the concept that it is not a reasonable
number. (They are generated for operations such as sqrt(-ve), 0.0/0.0
etc.) IEEE specifies that a NaN is unordered with respect to anything
else, EVEN ITSELF. Therefore ALL comparisons involving floating variables
MUST be generated by the compiler WITHOUT introducing logical negation,
since in the face of NaNs (and their unordered relationship with other
numbers)
(.NOT. (X .LT. 2.0)) does NOT imply (X .GE 2.0)
(If X is a NaN (X .LT. 2.0) is FALSE (it's not less it's unordered),
but (X .GE. 2.0) is also FALSE (it's not greater equal it's unordered)).
Similarly (and I've never seen this handled right in an optimising
compilation),
IF (X .ne. X) THEN
print *,'X is a NaN'
ELSE
print *,'X is a number'
ENDIF
should generate code which has a run time test.
-- Jim
James Cownie
Meiko Limited
650 Aztec West
Bristol BS12 4SD
England
Phone : +44 454 616171
FAX : +44 454 618188
E-Mail: jim@meiko.co.uk or jim@meiko.com
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.