This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.14-574-ge3a851a
- From: drepper at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 22 Dec 2011 03:08:28 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.14-574-ge3a851a
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via e3a851a21bb69a4b18065dd859a724cfd984d8b3 (commit)
from b27e24b8746b20d9ded426f202b79c3b7aeb953e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=e3a851a21bb69a4b18065dd859a724cfd984d8b3
commit e3a851a21bb69a4b18065dd859a724cfd984d8b3
Author: Ulrich Drepper <drepper@gmail.com>
Date: Wed Dec 21 22:08:12 2011 -0500
Use Kahan's formula in cacosh
diff --git a/ChangeLog b/ChangeLog
index 1ccc3dd..4d2b1fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-12-21 Ulrich Drepper <drepper@gmail.com>
+
+ * math/s_cacosh.c: Use Kahan's formula if the subtraction could lead
+ to large cancellation.
+ * math/s_cacoshf.c: Likewise.
+ * math/s_cacoshl.c: Likewise.
+
2011-11-18 Richard B. Kreckel <kreckel@ginac.de>
[BZ #13305]
diff --git a/math/s_cacosh.c b/math/s_cacosh.c
index df5ce69..cb01ca8 100644
--- a/math/s_cacosh.c
+++ b/math/s_cacosh.c
@@ -65,6 +65,11 @@ __cacosh (__complex__ double x)
__real__ res = 0.0;
__imag__ res = __copysign (M_PI_2, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0 * fabs (__imag__ x) < fabs (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0 * __clog (__csqrt ((x + 1.0) / 2.0) + __csqrt ((x - 1.0) / 2.0));
else
{
__complex__ double y;
diff --git a/math/s_cacoshf.c b/math/s_cacoshf.c
index aa4696f..fe04692 100644
--- a/math/s_cacoshf.c
+++ b/math/s_cacoshf.c
@@ -65,6 +65,12 @@ __cacoshf (__complex__ float x)
__real__ res = 0.0;
__imag__ res = __copysignf (M_PI_2, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0 * fabsf (__imag__ x) < fabsf (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0 * __clogf (__csqrtf ((x + 1.0) / 2.0)
+ + __csqrtf ((x - 1.0) / 2.0));
else
{
__complex__ float y;
diff --git a/math/s_cacoshl.c b/math/s_cacoshl.c
index b90b196..84c2715 100644
--- a/math/s_cacoshl.c
+++ b/math/s_cacoshl.c
@@ -65,6 +65,12 @@ __cacoshl (__complex__ long double x)
__real__ res = 0.0;
__imag__ res = __copysignl (M_PI_2l, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0L * fabsl (__imag__ x) < fabsl (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0L * __clogl (__csqrtl ((x + 1.0L) / 2.0L)
+ + __csqrtl ((x - 1.0L) / 2.0L));
else
{
__complex__ long double y;
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 7 +++++++
math/s_cacosh.c | 5 +++++
math/s_cacoshf.c | 6 ++++++
math/s_cacoshl.c | 6 ++++++
4 files changed, 24 insertions(+), 0 deletions(-)
hooks/post-receive
--
GNU C Library master sources