[Python-Dev] Caching float(0.0)

Alastair Houghton alastair at alastairs-place.net
Wed Oct 4 01:40:26 CEST 2006


On 3 Oct 2006, at 17:47, James Y Knight wrote:

> On Oct 3, 2006, at 8:30 AM, Martin v. Löwis wrote:
>> As Michael Hudson observed, this is difficult to implement, though:
>> You can't distinguish between -0.0 and +0.0 easily, yet you should.
>
> Of course you can. It's absolutely trivial. The only part that's even
> *the least bit* sketchy in this is assuming that a double is 64 bits.
> Practically speaking, that is true on all architectures I know of,

How about doing 1.0 / x, where x is the number you want to test?  On  
systems with sane semantics, it should result in an infinity, the  
sign of which should depend on the sign of the zero.  While I'm sure  
there are any number of places where it will break, on those  
platforms it seems to me that you're unlikely to care about the  
difference between +0.0 and -0.0 anyway, since it's hard to otherwise  
distinguish them.

e.g.

   double value_to_test;

   ...

   if (value_to_test == 0.0) {
     double my_inf = 1.0 / value_to_test;

     if (my_inf < 0.0) {
       /* We have a -ve zero */
     } else if (my_inf > 0.0) {
       /* We have a +ve zero */
     } else {
       /* This platform might not support infinities (though we might  
get a
          signal or something rather than getting here in that  
case...) */
     }
   }

(I should add that presently I've only tried it on a PowerPC, because  
it's late and that's what's in front of me.  It seems to work OK here.)

Kind regards,

Alastair

--
http://alastairs-place.net



More information about the Python-Dev mailing list