如何在Python中测试负零?

时间:2013-10-11 11:50:24

标签: python ieee-754

我想测试一个数字是正数还是负数,特别是在零的情况下。 IEEE-754允许-0.0,它是用Python实现的。

我能找到的唯一解决方法是:

def test_sign(x):
    return math.copysign(1, x) > 0

也许(可能需要更长时间才能运行):

def test_sign(x):
    math.atan2(x, -1)

我无法在常规库中的任何地方找到专用函数,我忽略了什么?

修改(为什么这是相关的)

这不再是我目前的计划,但在提出问题时,我试图根据参数是正面还是负面来重载函数。允许用户传递负零将解决对零值输入意味着的歧义。我认为这也可能对其他用例感兴趣。

2 个答案:

答案 0 :(得分:2)

您可以使用二进制表示法:

import struct
def binary(num):
    return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num))

会返回比特流

最高位是符号位(0为正,1为负)

然而,IEEE-754也声明+0.0 == -0.0 == 0.0。因此,不能确定例如-1.0+1.0将导致正零或负零。

答案 1 :(得分:1)

您可以使用struct模块直接测试位模式。

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