2013-10-11 3 views
5

मैं परीक्षण करना चाहता हूं कि कोई संख्या सकारात्मक या नकारात्मक है, खासकर शून्य के मामले में भी। आईईईई -754 -0.0 के लिए अनुमति देता है, और इसे पायथन में कार्यान्वित किया जाता है।पायथन में नकारात्मक शून्य के लिए मैं कैसे परीक्षण कर सकता हूं?

केवल समाधान मैं थे मिल सकता है:

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) देखें, या इन संदर्भों: [आईईईई 754-19 85] (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)) 

आप बिट स्ट्रीम

वापस आ जाएगी उच्चतम सा है पर हस्ताक्षर बिट (0 है सकारात्मक, 1 नकारात्मक)

हालांकि आईईईई -754 यह भी बताता है कि +0.0 == -0.0 == 0.0। इस प्रकार यह सुनिश्चित नहीं हो सकता है कि उदाहरण के लिए -1.0+1.0 उदाहरण के लिए सकारात्मक या नकारात्मक शून्य होगा।

+1

+1: मानक कहता है कि तीन "मान" गणितीय रूप से समान हैं, जो विचार करना महत्वपूर्ण है। चूंकि वे वही हैं, क्यों साइन की तलाश करें ... –

+1

@ डेविडबोज़क क्योंकि यह किसी फ़ंक्शन को सकारात्मक और नकारात्मक इनपुट के लिए अलग-अलग व्यवहार करने की अनुमति दे सकता है (उदाहरण के लिए 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 
संबंधित मुद्दे