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:
11
ChangeLog
11
ChangeLog
@ -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.
|
||||||
|
@ -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++)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
59
stdio-common/tst-sprintf2.c
Normal file
59
stdio-common/tst-sprintf2.c
Normal 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;
|
||||||
|
}
|
@ -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) \
|
||||||
|
Reference in New Issue
Block a user