exp() bug?
Lester Ingber
ingber@ingber.com
Tue Oct 5 16:35:00 GMT 2004
Eljay:
Hi. Thanks for your reply.
Yes, I agree with the situation, but I still am surprised that after
all these years gcc has not produced an option to ensure consistent
results.
Below is an update on my posting to cygwin.com.
Thanks.
Lester
On Tue, Oct 05, 2004 at 11:25:01AM -0500, Eljay Love-Jensen wrote:
: Date: Tue, 05 Oct 2004 11:25:01 -0500
: From: Eljay Love-Jensen <eljay@adobe.com>
: Subject: Re: exp() bug?
: In-reply-to: <20041005154308.GA3452@ingber.com>
: To: Lester Ingber <ingber@ingber.com>, gcc-help@gcc.gnu.org
:
: Hi Lester,
:
: Not a bug. Different platforms have different hardware, and as such
: different rounding or algorithms can cause variation in the least
: significant bits. (In non-technical terms, the fiddlybits.)
:
: There are techniques one can use to mitigate those situations. But they
: are hard to eliminate.
:
: Even in Java, which is supposed to be JVM centric and thus platform
: neutral, suffers from this problem without taking measures to guarantee
: IEEE 754 compliance.
:
: Sincerely,
: --Eljay
From: Lester Ingber <ingber@ingber.com>
To: cygwin@cygwin.com
Cc:
Bcc:
Subject: Re: exp() bug?
Reply-To:
The previous email had a typo, in that the OR pairs are as below.
In other words, the conclusion is the same: I saw no differences in
these 4 pairs of runs using or not using -ffloat-store.
In a code I make available to the public, www.ingber.com/ASA.zip, in
order to get consistent results over all reported platforms, I had to
make available a user-defined SMALL_FLOAT to handle most such instances.
Is there another gcc option that can force consistent results?
Lester
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
In reply to:
: From: cygwin-owner On Behalf Of Lester Ingber
: > Sent: 05 October 2004 16:36
:
: > I believe there is a bug in some gcc's, at least in the exp() function,
: > and at least in the way round-offs are (in)consistently treated.
:
: Go on?
:
: > I first noticed some differences in results in calculations using the
: > MINGW gcc vs the Cygwin gcc on my ThinkPad XPPro machine. I applied
: > the same code on FreeBsd and on SPARC/Solaris9.
:
: First go and google for "What every computer scientist should know about
: floating point", and read the entire paper. Then try running your tests again,
: but compile them with the "-ffloat-store" option. Then read "info gcc" about
: -ffloat-store and its effects.
:
: Then if you still think there's a bug, come back and describe it. But if you've
: taken all that in, you no longer will.
:
: cheers,
: DaveK
I disagree about what the default behavior should be. In any case, here are
runs with -ffloat-store. I see no difference.
Lester
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
From: Lester Ingber <ingber@ingber.com>
To: cygwin@cygwin.com
Subject: exp() bug?
I believe there is a bug in some gcc's, at least in the exp() function,
and at least in the way round-offs are (in)consistently treated.
I first noticed some differences in results in calculations using the
MINGW gcc vs the Cygwin gcc on my ThinkPad XPPro machine. I applied
the same code on FreeBsd and on SPARC/Solaris9.
If true, this is a **very** serious bug, leading to very different
answers on pretty standard (complex) calculations, as I discovered.
Here is the code for gcctest.c:
------------8<------------ top cut -> bottom ------------->8------------
/*
* rm gcctest.exe; gcc -O -mno-cygwin -o gcctest.exe gcctest.c -lm; gcctest.exe
* rm gcctest.exe; gcc -O -o gcctest.exe gcctest.c -lm; gcctest.exe
*
* rm gcctest.exe; gcc -O -ffloat-store -mno-cygwin -o gcctest.exe gcctest.c -lm; gcctest.exe
* rm gcctest.exe; gcc -O -ffloat-store -o gcctest.exe gcctest.c -lm; gcctest.exe
*/
#include <errno.h>
#include <math.h>
#include <stdio.h>
int main ();
int
main ()
{
double d;
d = exp (log (1234567.2)) - exp (log (1234567.1));
printf ("1234567.2-1234567.1: d = %g\n", d);
d = exp (log (12345678.2)) - exp (log (12345678.1));
printf ("12345678.2-12345678.1: d = %g\n", d);
d = exp (log (123456789.2)) - exp (log (123456789.1));
printf ("123456789.2-123456789.1: d = %g\n", d);
d = exp (log (1234567891.2)) - exp (log (1234567891.1));
printf ("1234567891.2-1234567891.1: d = %g\n", d);
d = exp (log (12345678912.2)) - exp (log (12345678912.1));
printf ("12345678912.2-12345678912.1: d = %g\n", d);
d = exp (log (123456789123.2)) - exp (log (123456789123.1));
printf ("123456789123.2-123456789123.1: d = %g\n", d);
d = exp (log (1234567891234.2)) - exp (log (1234567891234.1));
printf ("1234567891234.2-1234567891234.1: d = %g\n", d);
d = exp (log (12345678912345.2)) - exp (log (12345678912345.1));
printf ("12345678912345.2-12345678912345.1: d = %g\n", d);
d = exp (log (123456789123456.2)) - exp (log (123456789123456.1));
printf ("123456789123456.2-123456789123456.1: d = %g\n", d);
d = exp (log (1234567891234567.2)) - exp (log (1234567891234567.1));
printf ("1234567891234567.2-1234567891234567.1: d = %g\n", d);
d = exp (log (12345678912345678.2)) - exp (log (12345678912345678.1));
printf ("12345678912345678.2-12345678912345678.1: d = %g\n", d);
d = exp (log (123456789123456789.2)) - exp (log (123456789123456789.1));
printf ("123456789123456789.2-123456789123456789.1: d = %g\n", d);
return 0;
}
------------8<------------ bottom cut <- top ------------->8------------
Here are the results:
ThinkPad/XPPRO/gcc-3.3.3
% rm gcctest.exe ; gcc -O -mno-cygwin -o gcctest.exe gcctest.c -lm; gcctest.exe
OR
% rm gcctest.exe ; gcc -O -ffloat-store -mno-cygwin -o gcctest.exe gcctest.c -lm; gcctest.exe
1234567.2-1234567.1: d = 0.1
12345678.2-12345678.1: d = 0.1
123456789.2-123456789.1: d = 0.0999997
1234567891.2-1234567891.1: d = 0.0999979
12345678912.2-12345678912.1: d = 0.100002
123456789123.2-123456789123.1: d = 0.100002
1234567891234.2-1234567891234.1: d = 0.100916
12345678912345.2-12345678912345.1: d = 0.0868587
123456789123456.2-123456789123456.1: d = 0.000205994
1234567891234567.2-1234567891234567.1: d = -0.0303955
12345678912345678.2-12345678912345678.1: d = -0.0839844
123456789123456789.2-123456789123456789.1: d = -7.95313
ThinkPad/XPPRO/gcc-3.3.3
% rm gcctest.exe ; gcc -O -o gcctest.exe gcctest.c -lm; gcctest.exe
OR
% rm gcctest.exe ; gcc -ffloat-store -O -o gcctest.exe gcctest.c -lm; gcctest.exe
1234567.2-1234567.1: d = 0.1
12345678.2-12345678.1: d = 0.1
123456789.2-123456789.1: d = 0.0999997
1234567891.2-1234567891.1: d = 0.099998
12345678912.2-12345678912.1: d = 0.100002
123456789123.2-123456789123.1: d = 0.100006
1234567891234.2-1234567891234.1: d = 0.10083
12345678912345.2-12345678912345.1: d = 0.0859375
123456789123456.2-123456789123456.1: d = 0
1234567891234567.2-1234567891234567.1: d = 0
12345678912345678.2-12345678912345678.1: d = 0
123456789123456789.2-123456789123456789.1: d = 0
FreeBSD-4.10/gcc-2.95.4
% rm gcctest.exe ; gcc -O -o gcctest.exe gcctest.c -lm ; gcctest.exe
OR
% rm gcctest.exe ; gcc -O -ffloat-store -o gcctest.exe gcctest.c -lm ; gcctest.exe
1234567.2-1234567.1: d = 0.1
12345678.2-12345678.1: d = 0.1
123456789.2-123456789.1: d = 0.0999997
1234567891.2-1234567891.1: d = 0.0999979
12345678912.2-12345678912.1: d = 0.100002
123456789123.2-123456789123.1: d = 0.100002
1234567891234.2-1234567891234.1: d = 0.100916
12345678912345.2-12345678912345.1: d = 0.0868587
123456789123456.2-123456789123456.1: d = 0.000198364
1234567891234567.2-1234567891234567.1: d = -0.0303955
12345678912345678.2-12345678912345678.1: d = -0.0839844
123456789123456789.2-123456789123456789.1: d = -7.95312
SPARC/Solaris9/gcc-3.4.2
% rm gcctest.exe ; gcc -O -o gcctest.exe gcctest.c -lm ; gcctest.exe
OR
% rm gcctest.exe ; gcc -O -ffloat-store -o gcctest.exe gcctest.c -lm ; gcctest.exe
1234567.2-1234567.1: d = 0.1
12345678.2-12345678.1: d = 0.1
123456789.2-123456789.1: d = 0.0999997
1234567891.2-1234567891.1: d = 0.099998
12345678912.2-12345678912.1: d = 0.100002
123456789123.2-123456789123.1: d = 0.100006
1234567891234.2-1234567891234.1: d = 0.10083
12345678912345.2-12345678912345.1: d = 0.0859375
123456789123456.2-123456789123456.1: d = 0
1234567891234567.2-1234567891234567.1: d = 0
12345678912345678.2-12345678912345678.1: d = 0
123456789123456789.2-123456789123456789.1: d = 0
Any comments?
Lester
--
Prof. Lester Ingber ingber@ingber.com ingber@alumni.caltech.edu
www.ingber.com www.alumni.caltech.edu/~ingber
More information about the Gcc-help
mailing list