2013-10-11 2 views
5

숫자가 양수인지 음수인지 테스트하고 싶습니다. 특히 0 인 경우에도 테스트하고 싶습니다. IEEE-754는 -0.0을 허용하며, 파이썬으로 구현됩니다.파이썬에서 음수 0을 테스트하려면 어떻게해야합니까?

유일한 해결 방법 I이었다 찾을 수 :

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

어쩌면을 (아마 실행하는 데 시간이 더 걸립니다) :

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

나는 보통의 도서관 어디에서나 전용 기능을 찾을 수 없습니다, 한 나는 간과 해? (이 관련이었다 왜)

이 더 이상 내 현재 계획이 아니라, 질문을 할 때 내가 인수가 양 또는 음의 여부에 따라 함수를 오버로드 시도 :

편집

. 사용자가 음수 0을 전달할 수있게하면 0 값 입력에 대한 의미가 모호해질 수 있습니다. 그리고 나는 이것이 다른 유스 케이스에서도 일반적으로 관심이있을 것으로 생각한다.

+0

중복 가능성 (http://stackoverflow.com/questions/4083401/negative-zero-in-python) – Abhijit

+0

완전히 I 추측 없음. @quazgar는 서명을 테스트하는 방법을 묻는 것이지 그것에 관한 문제는 아닙니다. –

+3

-0을 음수로 취급해서는 안되며, 몇 가지 설명을 보려면 [here] (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)을 참조하십시오. –

답변

2

당신은 바이너리 표현을 사용할 수 있습니다

import struct 
def binary(num): 
    return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num)) 

는 당신에게 비트 스트림

을 반환을 가장 높은 비트 인 부호 비트 (01 부정적 긍정적이다)

그러나 IEEE -754는 또한 +0.0 == -0.0 == 0.0이라고 말합니다. 따라서 예를 들어 -1.0+1.0이 양수 또는 음수 0이되는 것을 확신 할 수 없습니다.

+1

IEEE-754 참고 사항에 대한 +1 : 표준에서는 세 개의 "값"이 수학적으로 같기 때문에 고려해야 할 중요 사항을 명시합니다. 그들은 동일하기 때문에 왜 기호를 찾으십니까? ... –

+1

@ DavidBožjak 함수가 양수 및 음수 입력에 대해 다르게 동작 할 수 있기 때문에 (예 : 1/x를 플로팅하는 것을 상상해보십시오).무한대의 부호는 '+ 0.0'또는 '-0.0'으로 나누는 지에 따라 달라질 수 있습니다. – quazgar

+1

@quazgar : 예. 그러나 일부 사람들은 '1/0.0'은'NaN '이어야한다고 말합니다. 그리고 대부분의 사람들은 일단 특정 숫자의 부호를 결정하기 시작하면 코드에 문제가 있다는 것에 동의 할 것입니다. –

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 
관련 문제