简体   繁体   中英

How can I test for negative zero in Python?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM