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

           Summary: LDBL_EPSILON is wrong on IRIX 6.5
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: r...@gcc.gnu.org
              Host: mips-sgi-irix6.5
            Target: mips-sgi-irix6.5
             Build: mips-sgi-irix6.5


When looking at a libstdc++ testsuite failure on IRIX 6.5

FAIL: 18_support/numeric_limits/epsilon.cc execution test

Assertion failed: EX, file
/vol/gcc/src/hg/gcc-4.6-branch/local/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc,
line 37

I found that the testcase aborts checking long double LDBL_EPSILON:

Program received signal SIGABRT, Aborted.
0x0fa4ac28 in _prctl () from /usr/lib32/libc.so.1
(gdb) where
[...]
#5  0x0fa756c4 in __assert () at
/xlv86/patches/7207/work/irix/lib/libc/libc_n32_M4/gen/assert.c:59
#6  0x10002210 in test_epsilon<long double> () at
/vol/gcc/src/hg/trunk/local/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc:37
#7  0x10002108 in main () at
/vol/gcc/src/hg/trunk/local/libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc:44

While epsilon is printed as 0 here, in
mips-sgi-irix6.5/libstdc++-v3/include/limits, I find __LDBL_EPSILON__ is
-1.596672247627775849325098170429471e+293

Running the testcase through g++ -g3 -save-temps, epsilon.ii reveals

#define __FLT_EPSILON__ 1.19209289550781250000000000000000e-7F
#define __DBL_EPSILON__ double(2.22044604925031308084726333618164e-16L)
#define __LDBL_EPSILON__ 4.94065645841246544176568792868221e-324L

which is obviously bogus.  The native <internal/float_core.h> has

#define FLT_EPSILON     1.19209290E-07F
#define DBL_EPSILON     2.2204460492503131E-16
#define LDBL_EPSILON    1.232595164407830945955825883254353E-32L

IRIX 6 uses the IBM double format for long double.  As expected, the
gcc.target/powerpc/rs6000-ldouble-2.c testcase also FAILs.

eps is correctly determined:

(gdb) p eps
$1 = 2.465190328815661891911651766508707e-32

This can be seen with the following test:

$ cat ld.c
#include <stdio.h>
#include <float.h>

int
main (void)
{
  printf ("LDBL_EPSILON = %Lg\n", LDBL_EPSILON);
  return 0;
}
$ cc -o ld-cc ld.c
$ ./ld-cc 
LDBL_EPSILON = 1.2326e-32
$ ./xgcc -B./ -o ld-gcc ld.c
$ ./ld-gcc 
LDBL_EPSILON = 4.94066e-324

Reply via email to