Floating point comparisons with NaN values produce wrong results
Stephen L Moshier
moshier@mediaone.net
Mon Sep 6 05:54:00 GMT 1999
Your fixed test case works properly on x86 and sparc.
Now we need a PA expert to look into the problem.
>Floating point comparisons (< <= > >=) with NaN values produce wrong
>results in
> GNU CPP version 2.95 19990718 (prerelease)
> hppa2.0-hp-hpux10.20
On Mon, 6 Sep 1999, Olli Saarela wrote:
> Stephen L Moshier wrote:
> >
> > > static const char double_q_nan_bytes_be[8] = {0x7f, 0xf8, 0, 0, 0, 0,
> > 0, 0};
> >
> > > #define double_q_nan (*(const double *)double_q_nan_bytes_be)
> >
> > This is not valid C language. You need to fix your test case.
>
> A fixed version is included below. This doesn't affect the results, the
> inequality comparisons (< > <= >=) still give wrong results.
>
> #include <stdio.h>
> #include <math.h>
>
> union DoubleInit {
> char bytes[8];
> double f;
> };
>
> /* Quiet NaN : depends on byte order */
>
> const union DoubleInit double_q_nan_bytes_le = {{0, 0, 0, 0, 0, 0, 0xf8,
> 0x7f}};
> const union DoubleInit double_q_nan_bytes_be = {{0x7f, 0xf8, 0, 0, 0, 0,
> 0, 0}};
>
> #define double_q_nan double_q_nan_bytes_be.f
>
> void compare(double x, double y) {
> printf("%10f < %10f %s\n", x, y, (x < y) ? "TRUE" : "FALSE");
> printf("%10f <= %10f %s\n", x, y, (x <= y) ? "TRUE" : "FALSE");
> printf("%10f > %10f %s\n", x, y, (x > y) ? "TRUE" : "FALSE");
> printf("%10f >= %10f %s\n", x, y, (x >= y) ? "TRUE" : "FALSE");
> printf("%10f == %10f %s\n", x, y, (x == y) ? "TRUE" : "FALSE");
> printf("%10f != %10f %s\n", x, y, (x != y) ? "TRUE" : "FALSE");
> printf("%10f == %10f %s\n", x, 0.0, (x == 0.0) ? "TRUE" : "FALSE");
> printf("%10f != %10f %s\n", x, 0.0, (x != 0.0) ? "TRUE" : "FALSE");
> printf("\n");
> }
>
> int main(int argc, char *argv[]) {
> compare(1.0, double_q_nan);
> compare(double_q_nan, 1.0);
> compare(double_q_nan, double_q_nan);
> return 0;
> }
>
> --
> Olli Saarela, KCL - The Finnish Pulp and Paper Research Institute
> Olli.Saarela@kcl.fi tel. +358-9-4371538 (office)
> Tekniikantie 2, Espoo-Otaniemi fax. +358-9-464305
> P.O. Box 70, FIN-02151 Espoo, Finland
>
More information about the Gcc-bugs
mailing list