Update ENTERI() macro
sgk at troutmask.apl.washington.edu
Fri Mar 8 00:22:50 UTC 2019
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.
--- 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 */
More information about the freebsd-numerics