Date: Tue, 14 Aug 2012 11:08:43 -0500 From: Stephen Montgomery-Smith <stephen@missouri.edu> To: Bruce Evans <brde@optusnet.com.au> Cc: freebsd-numerics@freebsd.org Subject: Re: Complex arg-trig functions Message-ID: <502A780B.2010106@missouri.edu> In-Reply-To: <20120814201105.T934@besplex.bde.org> References: <5017111E.6060003@missouri.edu> <501C361D.4010807@missouri.edu> <20120804165555.X1231@besplex.bde.org> <501D51D7.1020101@missouri.edu> <20120805030609.R3101@besplex.bde.org> <501D9C36.2040207@missouri.edu> <20120805175106.X3574@besplex.bde.org> <501EC015.3000808@missouri.edu> <20120805191954.GA50379@troutmask.apl.washington.edu> <20120807205725.GA10572@server.rulingia.com> <20120809025220.N4114@besplex.bde.org> <5027F07E.9060409@missouri.edu> <20120814003614.H3692@besplex.bde.org> <50295F5C.6010800@missouri.edu> <20120814072946.S5260@besplex.bde.org> <50297CA5.5010900@missouri.edu> <50297E43.7090309@missouri.edu> <20120814201105.T934@besplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 08/14/2012 05:46 AM, Bruce Evans wrote: > On Mon, 13 Aug 2012, Stephen Montgomery-Smith wrote: > >> >> if (sqrt_huge+x>one && sqrt_huge+y>one) > > x and y can be DBL_MAX, giving overflow. Why? When x is DBL_MAX, sqrt_huge is so very much smaller than DBL_MAX that DBL_MAX+sqrt_huge should be DBL_MAX within floating point precision. So no overflow. >>>> @ if (ISFINITE(bx) && ISFINITE(by) && (x > RECIP_SQRT_EPSILON_100 >>>> || y > RECIP_SQRT_EPSILON_100)) { > > since if bx or by is NaN, then it isn't > RECIP_SQRT_EPSILON_100, and > if it is Inf then I think handling it the same as DBL_MAX gives the > correct result. My original code did this. But for some reason, it didn't work in all cases. I didn't take note of which cases failed. > NaNs and Infs now fall through to do_hard_work(). > Wouldn't it be easier to never pass them to do_hard_work()? It seemed to me that there is a logic behind why the the infs and nans produce the results they do. I noticed that do_the_hard_work() already got the answers correct for the real part *rx. Getting the imaginary part to work as well seemed to me to be the cleanest way to make it work. (I added all the nan and inf checking after writing the rest of the code.) > > For just setting inexact, try an expression using `tiny'. There are > many examples to choose from. According to $(grep tiny.*inex *.c): If you still judge my solution incorrect, then I will look into these different solutions.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?502A780B.2010106>