2013-10-11 58 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