如何在Python中测试负零?

如何在Python中测试负零?,python,ieee-754,Python,Ieee 754,我想测试一个数字是正数还是负数,尤其是在零的情况下。IEEE-754允许-0.0,它是用Python实现的 我能找到的唯一解决办法是: def测试符号(x): 返回数学.copysign(1,x)>0 可能(可能需要更长的时间来运行): def测试符号(x): 数学atan2(x,-1) 我在通常的库中找不到专用函数,我是否忽略了什么 编辑:(为什么这是相关的) 这不再是我当前的计划,但当我问这个问题时,我试图根据参数是正是负来重载函数。允许用户传递负零将解决零值输入含义的模糊性。我认为这可

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

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

def测试符号(x):
返回数学.copysign(1,x)>0
可能(可能需要更长的时间来运行):

def测试符号(x):
数学atan2(x,-1)
我在通常的库中找不到专用函数,我是否忽略了什么

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


这不再是我当前的计划,但当我问这个问题时,我试图根据参数是正是负来重载函数。允许用户传递负零将解决零值输入含义的模糊性。我认为这可能对其他用例也有普遍意义。

您可以使用二进制表示:

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

您可以使用
结构
模块直接测试位模式

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

我想不完全是这样@quazgar要求提供一种测试符号的方法,而不是关于它的问题。您不应该将-0视为负数,请参阅以获取一些解释,或者这些参考:and.@arbautjc如果浮点数确实是数字,则这是真的。也许quazgar想用它们做些别的事情,例如通过一个方法传递一个位(符号位)。在结尾数字中,字符和对象都是0和1。我投票赞成这一点,认为这是重复的。虽然提议的原始版本提出了一个不同的问题,但这个问题完全包含在公认的答案中。@arbautjc:虽然负零的数学值为零,但它的符号位对于某些计算是有用的。参见IEEE -74注释中的+ 1:标准指出三个“值”在数学上是相同的,这是很重要的。既然它们是相同的,为什么要寻找符号…@DavidBožjak,因为它可能允许函数在正输入和负输入时表现不同(例如,想象绘制1/x)。无限的符号可能不同,这取决于你是除以
+0.0
还是“-0.0”。@quazgar:是的。然而,有些人认为
1/0.0
应该是
NaN
。大多数人可能会同意,一旦开始确定某个数字的符号,您的代码就出了问题。无论如何,在Python中,1/0.0抛出了一个ZeroDivision错误——有些人说这是一种罪恶。