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.
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.