Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Mar 2019 16:22:45 -0800
From:      Steve Kargl <sgk@troutmask.apl.washington.edu>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        freebsd-numerics@freebsd.org
Subject:   Re: Update ENTERI() macro
Message-ID:  <20190308002245.GA26338@troutmask.apl.washington.edu>
In-Reply-To: <20190306214233.GA23159@troutmask.apl.washington.edu>
References:  <20190227201214.V1823@besplex.bde.org> <20190227161906.GA77785@troutmask.apl.washington.edu> <20190228060920.R4413@besplex.bde.org> <20190304212159.GA12587@troutmask.apl.washington.edu> <20190305153243.Y1349@besplex.bde.org> <20190306055201.GA40298@troutmask.apl.washington.edu> <20190306225811.P2731@besplex.bde.org> <20190306184829.GA44023@troutmask.apl.washington.edu> <20190307061214.R4911@besplex.bde.org> <20190306214233.GA23159@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Mar 06, 2019 at 01:42:33PM -0800, Steve Kargl wrote:
> On Thu, Mar 07, 2019 at 06:30:42AM +1100, Bruce Evans wrote:
> > On Wed, 6 Mar 2019, Steve Kargl wrote:
> > 
> > > On Wed, Mar 06, 2019 at 11:56:23PM +1100, Bruce Evans wrote:
> > >> On Tue, 5 Mar 2019, Steve Kargl wrote:
> > >
> > >>> a similar k_cexpl.c.  Yes, I added the 'c' in the name to avoid
> > >>> confusion in ld80/.  In particular, I have no idea how he found
> > >>> his scaling value 'k'.  Any insights?
> > >>
> > >> bde already wrote __ldexp_cexpl() in ld*/k_expl.h, and kargl committed
> > >> it in r260066.  Does it not work? :-).
> > >>
> > >> Well, it hasn't been tested, and it indeed cannot work since it spells
> > >> cosl(y) as cos(y).
> > >
> > > Taking long breaks from pecking at libm issues seems to be
> > > conducive to memory loss.  I'll go review k_expl.h.  I simply
> > > remember it as having a kernel for expl().
> > 
> > I now see that you implemented 2 more versions of __ldexpl_cexpl() by
> > cloning the old double precision version.  Apparently the includes
> > are to unpolluted for the compiler to see the multiple versions :-).
> > 
> > Using the version in k_expl.h almost forces inlining of expl()'s kernel
> > and its large tables, just like for hyperbolic functions.  This wastes
> > a lot of space, especially for duplicating the tables.  It is only a
> > small optimization for time.  It is done for the hyperbolic functions
> > to get this optimization, and for __ldexpl_cexpl() just for convenience.
> 
> The version in k_expl.h has 2 bugs.  You note the first (cos instead
> of cosl).  The second is
> 
> In file included from /data/kargl/trunk/math/libm/msun/ld80/s_cexpl.c:43:
> /data/kargl/trunk/math/libm/msun/ld80/k_expl.h:288:22: error: magnitude of
>       floating-point constant too large for type 'double'; maximum is
>       1.7976931348623157E+308 [-Werror,-Wliteral-range]
>         exp_x = (lo + hi) * 0x1p16382;
>                             ^

Make that 3 bugs.  

Index: ld80/k_expl.h
===================================================================
--- ld80/k_expl.h	(revision 344600)
+++ ld80/k_expl.h	(working copy)
@@ -285,7 +285,7 @@
 	y = cimagl(z);
 	__k_expl(x, &hi, &lo, &k);
 
-	exp_x = (lo + hi) * 0x1p16382;
+	exp_x = (lo + hi) * 0x1p16382L;
 	expt += k - 16382;
 
 	scale1 = 1;
@@ -292,9 +292,9 @@
 	half_expt = expt / 2;
 	SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
 	scale2 = 1;
-	SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
+	SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
 
-	return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
+	return (CMPLXL(cosl(y) * exp_x * scale1 * scale2,
 	    sinl(y) * exp_x * scale1 * scale2));
 }
 #endif /* _COMPLEX_H */

-- 
Steve



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190308002245.GA26338>