[Numpy-discussion] making the distinction between -0.0 and 0.0..

Christopher Barker Chris.Barker@noaa....
Tue Sep 29 16:24:50 CDT 2009


Christian Heimes wrote:
> How about using atan2()? :)

unless atan2 shortcuts for the easy ones, that doesn't strike me as 
efficient (though with python function call overhead, maybe!).

Anyway, of course, some googling that I should have done in the first 
place, revealed "double.py", from Martin Jansche:

http://symptotic.com/mj/code.html
(MIT license).


double.py provides a full(?) set of IEEE functions for doubles in 
Python. His solution to the problem at hand is:

def signbit(value):
     """
     Test whether the sign bit of the given floating-point value is
     set.  If it is set, this generally means the given value is
     negative.  However, this is not the same as comparing the value
     to C{0.0}.  For example:

     >>> NEGATIVE_ZERO < 0.0
     False

     since negative zero is numerically equal to positive zero.  But
     the sign bit of negative zero is indeed set:

     >>> signbit(NEGATIVE_ZERO)
     True
     >>> signbit(0.0)
     False

     @type  value: float
     @param value: a Python (double-precision) float value

     @rtype:  bool
     @return: C{True} if the sign bit of C{value} is set;
              C{False} if it is not set.
     """
     return (doubleToRawLongBits(value) >> 63) == 1

where:

def doubleToRawLongBits(value):
     """
     @type  value: float
     @param value: a Python (double-precision) float value

     @rtype: long
     @return: the IEEE 754 bit representation (64 bits as a long integer)
              of the given double-precision floating-point value.
     """
     # pack double into 64 bits, then unpack as long int
     return _struct.unpack('Q', _struct.pack('d', value))[0]


Which is pretty much what I was looking for, though I can't say I've 
profiled the various options at hand!

-Chris



-- 
Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker@noaa.gov


More information about the NumPy-Discussion mailing list