unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny (v4)
@ 2020-08-07 11:25 Paul Zimmermann
  2020-08-07 19:33 ` Adhemerval Zanella via Libc-alpha
  0 siblings, 1 reply; 6+ messages in thread
From: Paul Zimmermann @ 2020-08-07 11:25 UTC (permalink / raw)
  To: libc-alpha

ping: https://sourceware.org/pipermail/libc-alpha/2020-August/116806.html

Have a nice week-end,
Paul

^ permalink raw reply	[flat|nested] 6+ messages in thread
* fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny
@ 2020-07-27 17:15 Paul Zimmermann
  2020-07-27 21:35 ` Joseph Myers
  0 siblings, 1 reply; 6+ messages in thread
From: Paul Zimmermann @ 2020-07-27 17:15 UTC (permalink / raw)
  To: libc-alpha

       Hi,

before the patch below, the maximum ulp error for j0 in the whole binary32
range is 6177902 ulps (for x = 3.153646966e+38).

After this patch, it is 900691 ulps (for x = 2.404825449e+00).

The patch fixes the case where x >= 2^127 and tiny sin(x)+cos(x).

Large remaining errors are due to a cancellation in another branch of the code.

Paul

PS: the same method can be applied to j1 and y1.
PS2: this can wait for 2.33 of course.

From 6b731f36b1a5badf4704645d0dda40957cedd0db Mon Sep 17 00:00:00 2001
From: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Date: Mon, 27 Jul 2020 19:01:18 +0200
Subject: [PATCH] fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is
 tiny

---
 sysdeps/ieee754/flt-32/e_j0f.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/sysdeps/ieee754/flt-32/e_j0f.c b/sysdeps/ieee754/flt-32/e_j0f.c
index c89b9f2688..f85d8a59e0 100644
--- a/sysdeps/ieee754/flt-32/e_j0f.c
+++ b/sysdeps/ieee754/flt-32/e_j0f.c
@@ -56,6 +56,22 @@ __ieee754_j0f(float x)
 		    if ((s*c)<zero) cc = z/ss;
 		    else	    ss = z/cc;
 		}
+                else {
+                  /* we subtract (exactly) a value x0 such that cos(x0)+sin(x0)
+                     is very near from 0, and use the identity
+                     sin(x-x0) = sin(x)*cos(x0)-cos(x)*sin(x0) to get
+                     sin(x) + cos(x) with extra accuracy */
+                   float x0 = 3.153646966e+38f;
+                   float y = x - x0; /* exact */
+                   /* sin(y) = sin(x)*cos(x0)-cos(x)*sin(x0) */
+                   z = __sinf (y);
+                   float eps = 8.17583368e-8f;
+                   /* cos(x0) ~ -sin(x0) + eps */
+                   z += eps * __cosf (x);
+                   /* now z ~ (sin(x)-cos(x))*cos(x0) */
+                   float cosx0 = -0.707106740f;
+                   cc = z / cosx0;
+                }
 	/*
 	 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
 	 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-08-11 11:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-07 11:25 fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny (v4) Paul Zimmermann
2020-08-07 19:33 ` Adhemerval Zanella via Libc-alpha
2020-08-07 20:30   ` Joseph Myers
2020-08-08 19:53     ` Adhemerval Zanella via Libc-alpha
2020-08-11 11:31       ` Paul Zimmermann
  -- strict thread matches above, loose matches on Subject: below --
2020-07-27 17:15 fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny Paul Zimmermann
2020-07-27 21:35 ` Joseph Myers
2020-07-28  8:23   ` Paul Zimmermann
2020-07-28  9:19     ` Andreas Schwab
2020-07-28 10:50       ` Paul Zimmermann
2020-07-28 18:09         ` Adhemerval Zanella via Libc-alpha
2020-07-29  7:03           ` fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny (v2) Paul Zimmermann
2020-07-29 20:25             ` Adhemerval Zanella via Libc-alpha
2020-07-30  7:20               ` fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny (v3) Paul Zimmermann
2020-07-30  8:53                 ` Florian Weimer via Libc-alpha
2020-08-03 13:19                   ` fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny (v4) Paul Zimmermann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).