Very cute. And for the record, on IEEE-compatible systems, the CPU has special handling of floating points if the funny bits are set, so they really are pretty close to constant:
pdl> $a = pdl(0)->float->log pdl> $b = pdl(0)->double->log pdl> p "a is $a and b is $b" a is -inf and b is -inf pdl> p "equal" if $a == $b equal David On Thu, Jan 19, 2012 at 1:58 PM, Joel Berger <[email protected]>wrote: > And why we always 'use warnings' (and strict too) > > On Thu, Jan 19, 2012 at 1:56 PM, Joel Berger <[email protected]> > wrote: > > As we learn from Nancy-typing > > (http://calculist.blogspot.com/2006/02/nancy-typing.html) Nan is easy > > to make in Perl. Its a numeric coercion of 'Nan' > > > > This is why perl -E' say "Nihilist" if "Nancy" != "Nancy"' is so much > fun. > > > > Joel > > > > > > On Thu, Jan 19, 2012 at 1:45 PM, Chris Marshall <[email protected]> > wrote: > >> On Thu, Jan 19, 2012 at 2:38 PM, David Mertens < > [email protected]> wrote: > >>> On Tue, Jan 3, 2012 at 3:41 PM, Chris Marshall <[email protected] > > > >>> wrote: > >>>> > >>>> On Tue, Jan 3, 2012 at 4:34 PM, David Mertens < > [email protected]> > >>>> wrote: > >>>> > > >>>> > > >>>> > On Tue, Jan 3, 2012 at 3:18 PM, Douglas Burke < > [email protected]> > >>>> > wrote: > >>>> >> > >>>> >> On 1/2/12 11:18 PM, David Mertens wrote: > >>>> >> > >>>> >>> Because PDL doesn't like boolean evaluations **except for > >>>> >>> single-element > >>>> >>> piddles**, this expression will croak if $a is anything more than > a > >>>> >>> one-dimensional vector. Have you tried running that conditional > when > >>>> >>> $a > >>>> >>> is more complex? For example, if $a is a matrix, this will croak. > >>>> >>> Something I didn't realize, but just learned messing with this, is > >>>> >>> that > >>>> >>> a single BAD value is considered boolean false. That's more clever > >>>> >>> than > >>>> >>> I had expected. :-) > >>>> >>> > >>>> >>> > >>>> >> > >>>> >> It's kind-of discussed in > >>>> >> > >>>> >> > >>>> >> > >>>> >> > http://pdl.perl.org/PDLdocs/BadValues.html#bad_values_and_boolean_operators > >>>> >> > >>>> >> (or, perhaps, this is out of date and needs re-writing), but it may > >>>> >> well > >>>> >> make sense for someone (not me, as I don't have the energy) to > move the > >>>> >> operational/useful parts of this document to PDL::Bad, leaving the > >>>> >> BadValues > >>>> >> document more for the > >>>> >> implementation/you-don't-need-to-read-this-to-just-use-it > >>>> >> documentation. I > >>>> >> can't remember if the docs for PDL::Bad is empty if support is not > >>>> >> included, > >>>> >> and - of so - whether it is that serious an issue (since if you > don't > >>>> >> have > >>>> >> the support compiled in then you don't really need to know about > how it > >>>> >> works). > >>>> >> > >>>> >>> In PDL 2.4.10, you should be able to return pdl('bad'). That's a > >>>> >>> recent > >>>> >>> implementation of mine. :-) Alternatively, perhaps PDL should add > BAD > >>>> >>> to > >>>> >>> PDL::Constants (as well as INF, for that matter). > >>>> >> > >>>> >> > >>>> >> As the bad-value can be changed for the integer types (and even > >>>> >> floating-point types, depending on how the code is built), I'm not > sure > >>>> >> that > >>>> >> you can really treat it as a constant, but this comment comes after > >>>> >> spending > >>>> >> all of 5 seconds thinking about the matter, so I may well be > missing > >>>> >> something completely obvious here ;-) > >>>> > >>>> Yes, that is why it is not in there. Even IEEE values like Inf and > NaN > >>>> can be ambiguous. > >>> > >>> > >>> I was thinking about this today, because I define and use Inf in my > plotting > >>> library (for which I have just written a collection of milestones and > >>> goals). First, generating infinity in Perl is as easy as this: > >>> > >>> my $inf = -pdl(0)->log->at(0); > >>> > >>> Mind you, sending zero to Perl's log function will make it squack, but > not > >>> PDL's. This will give the current machine's representation of infinity > for > >>> the current floating-point type you're using. As for generating nan, > I'm not > >>> sure how I'd do it in Perl, because I only use it in C/XS code, but the > >>> usual way in C code is to multiply zero times your just-acquired value > of > >>> infinity: > >>> > >>> double my_nan = my_inf * 0.0; > >>> > >>> Infinity times any positive number just returns infinity, but infinity > times > >>> zero returns nan, in your machine's architecture-dependent > representation. > >> > >> Yes, but INF is not defined for integer data types > >> and the values are different between 4byte and 8byte > >> floats. As for NaNs, there are multiple NaN values > >> that are allowed---more like an equivalence class. > >> > >> At any rate, it seems clear that they don't fit the > >> idea of a constant. > >> > >> --Chris > >> > >> _______________________________________________ > >> Perldl mailing list > >> [email protected] > >> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl > -- Sent via my carrier pigeon.
_______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
