Date: Wed, 15 Aug 2012 23:12:43 -0500 From: Stephen Montgomery-Smith <stephen@missouri.edu> To: freebsd-numerics@freebsd.org Subject: Re: Complex arg-trig functions Message-ID: <502C733B.1080306@missouri.edu> In-Reply-To: <502C0CF8.8040003@missouri.edu> 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> <502A780B.2010106@missouri.edu> <20120815223631.N1751@besplex.bde.org> <502C0CF8.8040003@missouri.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
On 08/15/2012 03:56 PM, Stephen Montgomery-Smith wrote: > On 08/15/2012 08:35 AM, Bruce Evans wrote: >> On Tue, 14 Aug 2012, Stephen Montgomery-Smith wrote: >> I added this to the NaN mixing in catan[h]*(), >> and now all my tests pass: >> >> % diff -c2 catrig.c~ catrig.c >> % *** catrig.c~ Sun Aug 12 17:29:18 2012 >> % --- catrig.c Wed Aug 15 11:57:02 2012 >> % *************** >> % *** 605,609 **** >> % */ >> % if (ISNAN(x) || ISNAN(y)) >> % ! return (cpack(x+y, x+y)); >> % % /* (x,inf) and (inf,y) and (inf,inf) -> (0,PI/2) */ >> % --- 609,613 ---- >> % */ >> % if (ISNAN(x) || ISNAN(y)) >> % ! return (cpack((x+0.0L)+(y+0), (x+0.0L)+(y+0))); >> % % /* (x,inf) and (inf,y) and (inf,inf) -> (0,PI/2) */ >> >> Use this expression in all precisions. > > > Would this work? > > if (ISNAN(x) || ISNAN(y)) > return (cpack((x+x)+(y+y), (x+x)+(y+y))); > I know Bruce is gone for a couple of weeks, but can someone else answer these questions? I decided to start reading a bit about nans: http://en.wikipedia.org/wiki/NaN I don't understand why my original code: if (ISNAN(x) || ISNAN(y)) return (cpack(x+y, x+y)); doesn't return quiet nans, and generally do everything else it should do (like raise invalid if one or both are signaling nans). This is what I read on the web page: "Signaling NaNs, or sNaNs, are special forms of a NaN that when consumed by most operations should raise an invalid exception and then, if appropriate, be "quieted" into a qNaN that may then propagate." This is Bruce's code: return (cpack((x+0.0L)+(y+0), (x+0.0L)+(y+0))) and he says he does this for all precisions. Why does he add 0.0L to x, but only add 0 to y?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?502C733B.1080306>