This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]