[Python-Dev] Caching float(0.0)

James Y Knight foom at fuhm.net
Tue Oct 3 18:47:02 CEST 2006


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,  
and if it's not guaranteed, it could easily be a 'configure' time check.

typedef union {
     double d;
     uint64_t i;
} rawdouble;

int isposzero(double a) {
     rawdouble zero;
     zero.d = 0.0;
     rawdouble aa;
     aa.d = a;
     return aa.i == zero.i;
}

int main() {
     if (sizeof(double) != sizeof(uint64_t))
         return 1;

     printf("%d\n", isposzero(0.0));
     printf("%d\n", isposzero(-0.0));

}

James


More information about the Python-Dev mailing list