|
Message-Id: <p9u0wmxr8sun.fsf@coriandre.loria.fr> Date: Sat, 19 Aug 2023 08:10:56 +0200 From: Paul Zimmermann <Paul.Zimmermann@...ia.fr> To: Szabolcs Nagy <nsz@...t70.net> Cc: musl@...ts.openwall.com Subject: Re: [PATCH 1/2] math: fix ld80 acoshl(x) for x < 0 Dear Szabolcs, ok for me, I now get a largest error of 2.99 ulp: NEW acosh 0 -1 0x1.1ecdb5b8f0c5d79p+0l [3] [2.99] 2.98085 2.980840623325726 Thank you for fixing that rapidly! Paul > Date: Fri, 18 Aug 2023 23:16:00 +0200 > From: Szabolcs Nagy <nsz@...t70.net> > Cc: musl@...ts.openwall.com > > acosh(x) is nan for x < 1, but x < 0 cases were not handled specially > and acoshl gave wrong result for some -0x1p32 < x < -2 values, e.g.: > > acoshl(-0x1p20) returned -inf, > acoshl(-0x1.4p20) returned -0x1.db365758403aa9acp+0L, > > fixed by checking the sign bit and handling it specially. > > reported by Paul Zimmermann. > --- > src/math/acoshl.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/src/math/acoshl.c b/src/math/acoshl.c > index 8d4b43f6..943cec17 100644 > --- a/src/math/acoshl.c > +++ b/src/math/acoshl.c > @@ -10,14 +10,18 @@ long double acoshl(long double x) > long double acoshl(long double x) > { > union ldshape u = {x}; > - int e = u.i.se & 0x7fff; > + int e = u.i.se; > > if (e < 0x3fff + 1) > - /* |x| < 2, invalid if x < 1 or nan */ > + /* 0 <= x < 2, invalid if x < 1 */ > return log1pl(x-1 + sqrtl((x-1)*(x-1)+2*(x-1))); > if (e < 0x3fff + 32) > - /* |x| < 0x1p32 */ > + /* 2 <= x < 0x1p32 */ > return logl(2*x - 1/(x+sqrtl(x*x-1))); > + if (e & 0x8000) > + /* x < 0 or x = -0, invalid */ > + return (x - x) / (x - x); > + /* 0x1p32 <= x or nan */ > return logl(x) + 0.693147180559945309417232121458176568L; > } > #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 > -- > 2.41.0 > >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.