Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Sep 2012 16:41:53 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Stephen Montgomery-Smith <stephen@missouri.edu>
Cc:        freebsd-numerics@freebsd.org
Subject:   Re: Complex arg-trig functions
Message-ID:  <20120918162105.U991@besplex.bde.org>
In-Reply-To: <5057F24B.7020605@missouri.edu>
References:  <5017111E.6060003@missouri.edu> <504D3CCD.2050006@missouri.edu> <504FF726.9060001@missouri.edu> <20120912191556.F1078@besplex.bde.org> <20120912225847.J1771@besplex.bde.org> <50511B40.3070009@missouri.edu> <20120913204808.T1964@besplex.bde.org> <5051F59C.6000603@missouri.edu> <20120914014208.I2862@besplex.bde.org> <50526050.2070303@missouri.edu> <20120914212403.H1983@besplex.bde.org> <50538E28.6050400@missouri.edu> <20120915231032.C2669@besplex.bde.org> <50548E15.3010405@missouri.edu> <5054C027.2040008@missouri.edu> <5054C200.7090307@missouri.edu> <20120916041132.D6344@besplex.bde.org> <50553424.2080902@missouri.edu> <20120916134730.Y957@besplex.bde.org> <5055ECA8.2080008@missouri.edu> <20120917022614.R2943@besplex.bde.org> <50562213.9020400@missouri.edu> <20120917060116.G3825@besplex.bde.org> <50563C57.60806@missouri.edu> <20120918012459.V5094@besplex.bde.org> <5057A932.3000603@missouri.edu> <5057F24B.7020605@missouri.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 17 Sep 2012, Stephen Montgomery-Smith wrote:

> On 09/17/2012 05:50 PM, Stephen Montgomery-Smith wrote:
>
>>> cacos*() and casin*() should benefit even more from an up-front raising
>>> of inexact, since do_hard_work() has 7 magic statements to raise inexact
>>> where sum_squares has only 1.
>> 
>> Where is the code that raises inexact up-front?
>
> I don't see why having code upfront will make it much more efficient. Out of 
> these 7 magic statements, at most two of them will be called.

7 instead of 1 is more complex, and uses more branch prediction resources.

> But I could put something like
>
> if ((x == 0 && y == 0) || (x == 0 && y == 1) || (int)(1+tiny) == 1) {
> ........
> at the beginning of do_hard_work and catanh.

I put without (x == 0 && y == 1) in catanh().  (x == 0 && y == 1) in it
is a bug, since catanh(I) = I*Pi/2 with inexact.  However, I seemed to
have missed (x == 1 && y == 0) -> catanh(1) = +Inf without inexact.

do_hard_work() is too late for this, since the following earlier cases
also need it:
- large x or y (neither infinite)
- small x and y (not both 0, except for acosh(0) = Pi/2 with inexact, etc.)
   (the lost optimization).

> OK, I think I made changes more or less according to your suggestions.
>
> In the case A < A_crossover, a threshold like DBL_EPSILON*DBL_EPSILON/128 is 
> required.  I think the one you set is too large.  It is important that 
> sqrt(x) + x/2 is sqrt(x).  (Again I don't think your tests would pick this 
> up, because you need to do a lot of tests where y is close to or equal to 1.)

Well, there were 2**12 of them with y = 1+denormal, with 7 different
denormals, but none with y = 1.  Will test some more.  (I'm testing
denormals with a few 1's in their lower bits since experience shows
that values with 0's in their lower bits are too special.  For example,
ax*ax is exact if enough lower bits in ax are 0.)

Bruce



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