1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

* sysdeps/ieee754/ldbl-128ibm/printf_fphex.c

(PRINT_FPHEX_LONG_DOUBLE): Fix printing numbers where lower double
	is non-zero, but smaller than 2 * __DBL_MIN__.
	* stdio-common/tst-sprintf2.c: New test.
	* stdio-common/Makefile (tests): Add tst-sprintf2.

	* math/test-misc.c (main): Don't run last batch of tests with
	IBM long double format.
This commit is contained in:
Ulrich Drepper
2007-06-04 14:38:22 +00:00
parent 04067002e8
commit 43b7682843
5 changed files with 96 additions and 18 deletions

View File

@ -1,3 +1,14 @@
2007-06-04 Jakub Jelinek <jakub@redhat.com>
* sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
(PRINT_FPHEX_LONG_DOUBLE): Fix printing numbers where lower double
is non-zero, but smaller than 2 * __DBL_MIN__.
* stdio-common/tst-sprintf2.c: New test.
* stdio-common/Makefile (tests): Add tst-sprintf2.
* math/test-misc.c (main): Don't run last batch of tests with
IBM long double format.
2007-05-31 Steven Munroe <sjmunroe@us.ibm.com> 2007-05-31 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/powerpc/powerpc32/970/fpu/Implies: New file. * sysdeps/powerpc/powerpc32/970/fpu/Implies: New file.

View File

@ -1235,7 +1235,12 @@ main (void)
} }
#endif #endif
#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG >= DBL_MANT_DIG + 4 /* Skip testing IBM long double format, for 2 reasons:
1) it only supports FE_TONEAREST
2) nextafter (0.0, 1.0) == nextafterl (0.0L, 1.0L), so
nextafter (0.0, 1.0) / 16.0L will be 0.0L. */
#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG >= DBL_MANT_DIG + 4 \
&& LDBL_MANT_DIG != 106
int oldmode = fegetround (); int oldmode = fegetround ();
int j; int j;
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)

View File

@ -54,7 +54,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \ tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \
tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \ tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \
tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
tst-fwrite bug16 bug17 tst-swscanf tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2
test-srcs = tst-unbputc tst-printf test-srcs = tst-unbputc tst-printf

View File

@ -0,0 +1,59 @@
#include <float.h>
#include <math.h>
#include <stdio.h>
int
main (void)
{
volatile union { long double l; long long x[2]; } u;
char buf[64];
int result = 0;
#define TEST(val) \
do \
{ \
u.l = (val); \
snprintf (buf, sizeof buf, "%LaL", u.l); \
if (strcmp (buf, #val) != 0) \
{ \
printf ("Error on line %d: %s != %s\n", __LINE__, buf, #val); \
result = 1; \
} \
/* printf ("%s %La %016Lx %016Lx\n", #val, u.l, u.x[0], u.x[1]); */ \
} \
while (0)
#if LDBL_MANT_DIG >= 106
# if LDBL_MANT_DIG == 106
TEST (0x0.ffffffffffffp-1022L);
TEST (0x0.ffffffffffff1p-1022L);
TEST (0x0.fffffffffffffp-1022L);
# endif
TEST (0x1p-1022L);
TEST (0x1.0000000000001p-1022L);
TEST (0x1.00000000001e7p-1022L);
TEST (0x1.fffffffffffffp-1022L);
TEST (0x1p-1021L);
TEST (0x1.00000000000008p-1021L);
TEST (0x1.0000000000001p-1021L);
TEST (0x1.00000000000018p-1021L);
TEST (0x1.0000000000000f8p-1017L);
TEST (0x1.0000000000001p-1017L);
TEST (0x1.000000000000108p-1017L);
TEST (0x1.000000000000dcf8p-1013L);
TEST (0x1.000000000000ddp-1013L);
TEST (0x1.000000000000dd08p-1013L);
TEST (0x1.ffffffffffffffffffffffffffp-1L);
TEST (0x1.ffffffffffffffffffffffffff8p-1L);
TEST (0x1p+0L);
TEST (0x1.000000000000000000000000008p+0L);
TEST (0x1.00000000000000000000000001p+0L);
TEST (0x1.000000000000000000000000018p+0L);
TEST (0x1.23456789abcdef123456789abc8p+0L);
TEST (0x1.23456789abcde7123456789abc8p+0L);
TEST (0x1.23456789abcdef123456789abc8p+64L);
TEST (0x1.23456789abcde7123456789abc8p+64L);
TEST (0x1.123456789abcdef123456789p-969L);
#endif
return result;
}

View File

@ -1,5 +1,5 @@
/* Print floating point number in hexadecimal notation according to ISO C99. /* Print floating point number in hexadecimal notation according to ISO C99.
Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006 Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006,2007
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -35,21 +35,24 @@ do { \
\ \
lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3; \ lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3; \
hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1; \ hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1; \
lo <<= 7; /* pre-shift lo to match ieee854. */ \
/* If the lower double is not a denomal or zero then set the hidden \ /* If the lower double is not a denomal or zero then set the hidden \
53rd bit. */ \ 53rd bit. */ \
if (eldbl.ieee.exponent2 > 0x001) \ if (eldbl.ieee.exponent2 != 0) \
{ \ lo |= (1ULL << (52 + 7)); \
lo |= (1ULL << 52); \ else \
lo = lo << 7; /* pre-shift lo to match ieee854. */ \ lo <<= 1; \
/* The lower double is normalized separately from the upper. We \ /* The lower double is normalized separately from the upper. We \
may need to adjust the lower manitissa to reflect this. */ \ may need to adjust the lower manitissa to reflect this. */ \
ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; \ ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; \
if (ediff > 53) \ if (ediff > 53 + 63) \
lo = 0; \
else if (ediff > 53) \
lo = lo >> (ediff - 53); \ lo = lo >> (ediff - 53); \
} \ else if (eldbl.ieee.exponent2 == 0 && ediff < 53) \
\ lo = lo << (53 - ediff); \
if ((eldbl.ieee.negative != eldbl.ieee.negative2) \ if (eldbl.ieee.negative != eldbl.ieee.negative2 \
&& ((eldbl.ieee.exponent2 != 0) && (lo != 0L))) \ && (eldbl.ieee.exponent2 != 0 || lo != 0L)) \
{ \ { \
lo = (1ULL << 60) - lo; \ lo = (1ULL << 60) - lo; \
if (hi == 0L) \ if (hi == 0L) \