2013-10-11 23 views
5

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

唯一的解决方法,我可以被找到:

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

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

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

我不能在通常的图书馆找到了专用功能的任何地方,做我忽略了什么?

编辑:(为什么这是有关)

这不是我目前的计划了,但问这个问题时,我试图超载根据参数值是否是正面或负面的功能。允许用户传递负零将解决零值输入的含义。我认为这也可能是其他用例的普遍兴趣。

+0

可能重复(http://stackoverflow.com/questions/4083401/negative-zero-in-python) – Abhijit

+0

不完全我想。 @quazgar要求测试标志的方法,而不是问题。 –

+3

您不应将-0视为否定的,请参阅[此处](https://en.wikipedia.org/wiki/Signed_zero)以获取一些解释或参考文献:[IEEE 754-1985](http:// www。 validlab.com/754R/standards/754.pdf)和[每个计算机科学家应该了解的浮点运算](http://www.validlab.com/goldberg/paper.pdf)。 – 2013-10-11 12:01:24

回答

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

IEEE-754注释+1:标准规定三个“值”在数学上是相同的,这是重要的考虑因素。因为它们是相同的,所以为什么要寻找这个标志...... –

+1

@DavidBožjak因为它可能允许一个函数在正面和负面输入方面有不同的表现(想象一下例如绘制1/x)。无穷大的符号可能会有所不同,具体取决于您是用“+ 0.0”还是“-0.0”进行分割。 – quazgar

+1

@quazgar:是的。但有些人认为'1/0.0'应该是'NaN'。大多数人可能会同意,一旦开始确定某个数字的符号,您的代码就会出现问题。 –

1

您可以使用struct模块直接测试位模式。 [在python负零]的

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