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>