7

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

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

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

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

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

我在常用库中的任何地方都找不到专用函数,是我忽略了什么吗?

编辑:(为什么这是相关的)

这不再是我目前的计划,但是当我提出这个问题时,我试图根据参数是正面还是负面来重载一个函数。允许用户传递负零将解决零值输入的歧义。而且我认为这对于其他用例也可能具有普遍意义。

4

2 回答 2

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会导致正或负零。

于 2013-10-11T11:56:47.813 回答
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
于 2015-01-30T21:09:33.390 回答