Fix log10 (1) in round-downward mode (bug 16977).

As with various other issues of this kind, bug 16977 is log10 (1)
wrongly returning -0 rather than +0 in round-downward mode because of
an implementation effectively in terms of log1p (x - 1).  This patch
fixes the issue in the same way used for log.

Tested x86_64 and x86 and ulps updated accordingly.  Also tested for
mips64 to confirm a fix was needed for ldbl-128 and to validate that
fix (also applied to ldbl-128ibm since that version of logl is
essentially the same as the ldbl-128 one).

	[BZ #16977]
	* sysdeps/i386/fpu/e_log10.S (__ieee754_log10): Take absolute
	value when x - 1 is zero.
	* sysdeps/i386/fpu/e_log10f.S (__ieee754_log10f): Likewise.
	* sysdeps/i386/fpu/e_log10l.S (__ieee754_log10l): Likewise.
	* sysdeps/ieee754/ldbl-128/e_log10l.c (__ieee754_log10l): Return
	0.0L for an argument of 1.0L.
	* sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l):
	Likewise.
	* sysdeps/x86_64/fpu/e_log10l.S (__ieee754_log10l): Take absolute
	value when x - 1 is zero.
	* math/libm-test.inc (log10_test): Use ALL_RM_TEST.
	* sysdeps/i386/fpu/libm-test-ulps: Update.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
This commit is contained in:
Joseph Myers 2014-05-23 12:07:50 +00:00
parent 2302d679ce
commit b72592e75f
11 changed files with 101 additions and 8 deletions

View File

@ -1,3 +1,20 @@
2014-05-23 Joseph Myers <joseph@codesourcery.com>
[BZ #16977]
* sysdeps/i386/fpu/e_log10.S (__ieee754_log10): Take absolute
value when x - 1 is zero.
* sysdeps/i386/fpu/e_log10f.S (__ieee754_log10f): Likewise.
* sysdeps/i386/fpu/e_log10l.S (__ieee754_log10l): Likewise.
* sysdeps/ieee754/ldbl-128/e_log10l.c (__ieee754_log10l): Return
0.0L for an argument of 1.0L.
* sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l):
Likewise.
* sysdeps/x86_64/fpu/e_log10l.S (__ieee754_log10l): Take absolute
value when x - 1 is zero.
* math/libm-test.inc (log10_test): Use ALL_RM_TEST.
* sysdeps/i386/fpu/libm-test-ulps: Update.
* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
2014-05-23 Rasmus Villemoes <rv@rasmusvillemoes.dk>
* manual/filesys.texi (Scanning Directory Content): Fix prototype of

2
NEWS
View File

@ -18,7 +18,7 @@ Version 2.20
16760, 16770, 16786, 16789, 16791, 16799, 16800, 16815, 16823, 16824,
16831, 16838, 16849, 16854, 16876, 16877, 16885, 16888, 16890, 16912,
16915, 16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16966,
16967, 16965.
16967, 16965, 16977.
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.32.

View File

@ -7798,9 +7798,7 @@ static const struct test_f_f_data log10_test_data[] =
static void
log10_test (void)
{
START (log10, 0);
RUN_TEST_LOOP_f_f (log10, log10_test_data, );
END;
ALL_RM_TEST (log10, 0, log10_test_data, RUN_TEST_LOOP_f_f, END);
}

View File

@ -46,7 +46,13 @@ ENTRY(__ieee754_log10)
fnstsw // x-1 : x : log10(2)
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : log10(2)
fxam
fnstsw
andb $0x45, %ah
cmpb $0x40, %ah
jne 5f
fabs // log10(1) is +0 in all rounding modes.
5: fstp %st(1) // x-1 : log10(2)
fyl2xp1 // log10(x)
ret

View File

@ -47,7 +47,13 @@ ENTRY(__ieee754_log10f)
fnstsw // x-1 : x : log10(2)
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : log10(2)
fxam
fnstsw
andb $0x45, %ah
cmpb $0x40, %ah
jne 5f
fabs // log10(1) is +0 in all rounding modes.
5: fstp %st(1) // x-1 : log10(2)
fyl2xp1 // log10(x)
ret

View File

@ -48,7 +48,13 @@ ENTRY(__ieee754_log10l)
fnstsw // x-1 : x : log10(2)
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : log10(2)
fxam
fnstsw
andb $0x45, %ah
cmpb $0x40, %ah
jne 5f
fabs // log10(1) is +0 in all rounding modes.
5: fstp %st(1) // x-1 : log10(2)
fyl2xp1 // log10(x)
ret

View File

@ -1536,6 +1536,30 @@ Function: "log10":
ildouble: 1
ldouble: 1
Function: "log10_downward":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log10_towardzero":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log10_upward":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log1p":
ildouble: 1
ldouble: 1

View File

@ -193,6 +193,9 @@ __ieee754_log10l (long double x)
if (hx >= 0x7fff000000000000LL)
return (x + x);
if (x == 1.0L)
return 0.0L;
/* separate mantissa from exponent */
/* Note, frexp is used so that denormal numbers

View File

@ -195,6 +195,9 @@ __ieee754_log10l (long double x)
if (hx >= 0x7ff0000000000000LL)
return (x + x);
if (x == 1.0L)
return 0.0L;
/* separate mantissa from exponent */
/* Note, frexp is used so that denormal numbers

View File

@ -46,7 +46,13 @@ ENTRY(__ieee754_log10l)
fnstsw // x-1 : x : log10(2)
andb $0x45, %ah
jz 2f
fstp %st(1) // x-1 : log10(2)
fxam
fnstsw
andb $0x45, %ah
cmpb $0x40, %ah
jne 5f
fabs // log10(1) is +0 in all rounding modes.
5: fstp %st(1) // x-1 : log10(2)
fyl2xp1 // log10(x)
ret

View File

@ -1611,6 +1611,30 @@ ifloat: 2
ildouble: 1
ldouble: 1
Function: "log10_downward":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log10_towardzero":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log10_upward":
double: 1
float: 1
idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
Function: "log1p":
float: 1
ifloat: 1