Jim Meyering wrote: > It seems to have exposed a problem in gnulib's vasnprintf.c: > > freebsd6$ gdb --args ./seq 0.8 0.1 0.9 > GNU gdb 6.6 > (gdb) r > Starting program: /tmp/coreutils-6.9.89.27-a9805-dirty/src/seq 0.8 0.1 0.9 > 0.8 > Program received signal SIGABRT, Aborted. > 0x28136363 in kill () from /lib/libc.so.6 > (gdb) up > #1 0x28136300 in raise () from /lib/libc.so.6 > (gdb) > #2 0x28135014 in abort () from /lib/libc.so.6 > (gdb) > #3 0x0804d8f1 in decode_long_double > (x=0.80000000000000000001084202172485504, > ep=0xbfbfe1e0, mp=0xbfbfe1d8) at vasnprintf.c:877 > 877 abort (); > (gdb) l > 872 if (!(y >= 0.0L && y < 1.0L)) > 873 abort (); > 874 m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; > 875 } > 876 if (!(y == 0.0L)) > 877 abort (); > 878 /* Normalise. */ > 879 while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) > 880 m.nlimbs--; > 881 *mp = m; > (gdb) p y > $1 = 0.60009765625 > (gdb) p ep > $2 = (int *) 0xbfbfe1e0 > (gdb) p *ep > $3 = -858993460 > (gdb) up > #4 0x0804e3ca in scale10_round_decimal_long_double ( > x=0.80000000000000000001084202172485504, n=1) at vasnprintf.c:1205 > 1205 void *memory = decode_long_double (x, &e, &m); > (gdb) p x > $4 = 0.80000000000000000001084202172485504 > (gdb) dow > #3 0x0804d8f1 in decode_long_double > (x=0.80000000000000000001084202172485504, > ep=0xbfbfe1e0, mp=0xbfbfe1d8) at vasnprintf.c:877 > 877 abort (); > (gdb) l > 872 if (!(y >= 0.0L && y < 1.0L)) > 873 abort (); > 874 m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; > 875 } > 876 if (!(y == 0.0L)) > 877 abort ();
It looks like the calculations with 'long double's are computed with ca. 16 bits more precision than what LDBL_MANT_BIT says. I can not reproduce the problem with a small test program on FreeBSD/x86 6.1: ============================= foo.c ============================= #include <stdio.h> long double a = 4.0L; long double b = 5.0L; int main () { long double x = a / b; printf ("%.1Le\n", x); printf ("%.1Lf\n", x); printf ("%.1Lg\n", x); return 0; } ================================================================== What's the CPU in use? "info registers" ? Value of LDBL_MANT_BIT? sizeof (long double) = ? Can you show the output of (gdb) set height 1000 (gdb) disassemble decode_long_double ? Bruno