I want to test if a number is positive or negative, especially also in the case of zero. IEEE-754 allows for -0.0
, and it is implemented in Python.
The only workarounds I could find were:
def test_sign(x):
return math.copysign(1, x) > 0
And maybe (probably takes longer to run):
def test_sign(x):
math.atan2(x, -1)
I could not find a dedicated function anywhere in the usual libraries, did I overlook something?
Edit: (Why this was relevant)
This is not my current plan anymore, but when asking the question I tried to overload a function depending on whether an argument was positive or negative. Allowing the user to pass negative zeros would resolve the ambiguity what was meant for zero-valued input. And I think this may be of general interest for other use cases as well.
Yes, there is a difference between 0.0 and -0.0 (though Python won't let me reproduce it :-P). If you divide a positive number by 0.0, you get positive infinity; if you divide that same number by -0.0 you get negative infinity.
There's no such thing as negative zero. For a binary integer, setting the sign bit to 1 and all other bits to zero, you get the smallest negative value for that integer size. (Assuming signed numbers.) Negative zero is actually used in mathematical analysis, especially in limit calculations.
Positive numbers are greater than 0 and located to the right of 0 on a number line. Negative numbers are less than 0 and located to the left of 0 on a number line. The number zero is neither positive nor negative.
You could use the binary representation:
import struct
def binary(num):
return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num))
will return you the bit stream
The highest bit is the sign bit (0
is positive, 1
is negative)
However IEEE-754 also states that +0.0 == -0.0 == 0.0. Thus can't be sure that for instance -1.0+1.0
will for instance result in a positive or negative zero.
You can use the struct
module to test the bit pattern directly.
import struct
def is_neg_zero(n):
return struct.pack('>d', n) == '\x80\x00\x00\x00\x00\x00\x00\x00'
def is_negative(n):
return ord(struct.pack('>d', n)[0]) & 0x80 != 0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With