This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH][4.3] Expand lround inline for x86_64/i?86 SSE math
Steve Kargl wrote:
On Thu, Oct 19, 2006 at 03:34:23PM -0700, Steve Kargl wrote:
It states that NINT(X) = INT(X+0.5) for X > 0. You then
find INT(A) = 0 for |A| < 1. A quick scan over the section
on numeric binary operators did not reveal the normal
weasel words, but I suspect that the result of X+0.5 is a
processor-dependent approximation and round-to-nearest
meets that criterium.
OTOH, I think it is a bug because we can choose a better
algorithm to determine if x+0.5 is truly less than 1.
See for example round[f] in intrinsics/c99_functions.c
Upon further review, the standard says NINT(X) = INT(X+0.5)
for X > 0. So, if and when someone makes a change to the
inlining of NINT(X), its result needs to agree with
Note, though, the complete change of language in the definition of NINT
in the Fortran 2003 standard. In the pathological cases where they
might arguably be held to require different things, I think we should be
following the later language.
Beyond that, I am also somewhat dubious about the idea that the language
you cite was really meant to mean that NINT(X) must be subject to
exactly the same rounding errors as INT(X+0.5). I think that's the same
sort of splitting too fine a hair that Richard Maine told me I was doing
when I claimed a few months ago that DATA I/.../ and I=... were required
to treat the largest negative integer differently. :)