我想测试一个数字是正数还是负数,特别是在零的情况下。 IEEE-754允许-0.0
,它是用Python实现的。
我能找到的唯一解决方法是:
def test_sign(x):
return math.copysign(1, x) > 0
也许(可能需要更长时间才能运行):
def test_sign(x):
math.atan2(x, -1)
我无法在常规库中的任何地方找到专用函数,我忽略了什么?
修改(为什么这是相关的)
这不再是我目前的计划,但在提出问题时,我试图根据参数是正面还是负面来重载函数。允许用户传递负零将解决对零值输入意味着的歧义。我认为这也可能对其他用例感兴趣。
答案 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