Skip site navigation (1)Skip section navigation (2)
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>