2009-06-01 21 views
9

मैं सिर्फ इस परिदृश्य ने काट लिया था:क्यों "**" नकारात्मकता से अधिक कसकर बांधता है?

>>> -1 ** 2 
-1 

अब, अजगर डॉक्स, it's clear that this is intended behavior के माध्यम से खुदाई, लेकिन क्यों? मैं किसी भी अन्य भाषाओं के साथ एक अंतर्निहित ऑपरेटर के रूप में काम नहीं करता हूं, लेकिन जितना संभव हो उतना मुश्किल से बाध्य नहीं होने के कारण मेरे लिए खतरनाक रूप से प्रतिद्वंद्वी लगता है।

क्या ऐसा कोई कारण है? बिजली ऑपरेटरों के साथ अन्य भाषाओं को समान व्यवहार करते हैं?

+1

http://www.wolframalpha.com/input/?i = -1^2 उपज -1 यह गणित –

+4

में समान है इसलिए मुझे इन्फिक्स नोटेशन पसंद नहीं है। (expt -1 2) अस्पष्ट है, जैसा कि है (- (1 1 निकालें))। – Svante

+0

यह निश्चित रूप से प्रतिद्वंद्वी है: यदि शून्य ऑपरेशन दो ऑपरेटरों के बीच में नहीं था, लेकिन एक यूनरी ऑपरेटर के रूप में इसे प्राथमिकता लेनी चाहिए (लेकिन यह कभी नहीं करता है, केवल उन अजीब चीजों में से एक)। –

उत्तर

22

यह व्यवहार गणित सूत्रों जैसा ही है, इसलिए मुझे यकीन नहीं है कि समस्या क्या है, या यह प्रतिद्वंद्वी क्यों है। क्या आप समझा सकते हैं कि आपने कुछ अलग कहां देखा है? "**" हमेशा "-" से अधिक बाध्य: -x^2 (-x)^2

बस (-1) ** 2 का उपयोग करें, जैसा कि आप गणित में करते हैं।

+0

@ नोस्को - व्यक्तिगत रूप से, मैं असहमत हूं। मैं आमतौर पर -x^2 को (-x)^2 * के रूप में समझूंगा * जब तक कि आप घटा रहे हों। तो 1-x^2 1 + होगा (x^2) –

+6

@ जेसन: अपनी पूर्व-बीजगणित पुस्तक को दोबारा पढ़ें ... ऐसा नहीं है कि गणित कैसे काम करता है। – rmeador

+7

@ जेसन, आप असहमत हो सकते हैं लेकिन यह मानक है कि गणितज्ञों ने बसना है। –

3

तो मुझे लगता है कि करने के लिए किया था, यह होगा क्योंकि एक घातांक ऑपरेटर होने प्रोग्रामर आसानी से आंशिक शक्तियों को संख्या बढ़ाने के लिए अनुमति देता है। आंशिक शक्तियों को विभाजित करने वाली नकारात्मक संख्याएं एक काल्पनिक घटक (आमतौर पर) के साथ समाप्त होती हैं, जिससे कि बाध्यकारी से बचा जा सकता है ** यूनरी से अधिक कसकर -। अधिकांश भाषाओं को काल्पनिक संख्या पसंद नहीं है।

आखिरकार, यह सिर्फ एक सम्मेलन है - और अपने कोड को स्वयं और अन्य लोगों द्वारा लाइन के नीचे पठनीय बनाने के लिए, आप शायद अपने (-1) को स्पष्ट रूप से समूहित करना चाहते हैं, इसलिए कोई भी उसके द्वारा पकड़ा नहीं जाता जाल :) शुभकामनाएँ!

4

लघु जवाब: यह गणित में मानक तरीका पूर्वता काम करता है।

मान लीजिए कि मैं बहुपद 3x 3x 2 + 5.

def polynomial(x): 
    return 3*x**3 - x**2 + 5 

यह की तुलना में बेहतर लग रहा है का मूल्यांकन करना चाहते हैं ...

def polynomial 
    return 3*x**3 - (x**2) + 5 

और पहला तरीका तरीका है गणितज्ञ इसे करते हैं। एक्सपोनिएशन के साथ अन्य भाषाएं वैसे ही काम करती हैं। ध्यान दें कि निषेध ऑपरेटर भी गुणा से भी अधिक शिथिल बांधता है, तो

-x*y === -(x*y) 

कौन सा भी तरह वे गणित में ऐसा है।

+1

बाइनरी घटाव उदाहरण अप्रासंगिक लगता है। गुणा के साथ यूनरी माइनस उदाहरण अधिक मूल्यवान है। –

+0

- (x * y) वास्तव में (-x) * y जैसा ही है, तो क्या गुणा गुणा से कम या कम ढीला होता है, यह वास्तव में स्पष्ट नहीं है (हालांकि मैं आपके साथ सहमत हूं)। इसके अलावा, @ एसएलॉट, मुझे यकीन नहीं है कि गणित यूनरी और बाइनरी के बीच अंतर करता है- – weronika

+0

@weronika: वे गणितीय रूप से समान हो सकते हैं, लेकिन वे कंप्यूटर प्रोग्राम में जरूरी नहीं हैं। उदाहरण के लिए, यदि आप 32-बिट पूर्णांक के साथ काम कर रहे हैं, तो '(-0x40000000) * 2'' - (0x40000000 * 2) 'जैसा नहीं है, क्योंकि बाद वाला अतिप्रवाह होता है। यदि आपका पर्यावरण बहती है, तो केवल पहला सही है। यह पाइथन पर भी लागू हो सकता है, अगर आप 32-बिट पूर्णांक को जोड़ रहे हैं उदा। numpy के माध्यम से। –

-1

OCaml एक ही

# -12.0**2.0 
    ;; 
- : float = 144. 

तरह का अजीब है कि ... कि लिंक हालांकि पर

# -12.0**0.5;; 
- : float = nan 

देखो ऐसा नहीं करता है ... order of operations

+2

ओकंपल टूट गया है। यह इस मूल गणित नियम का पालन नहीं करता है। – nosklo

1

यह करने के लिए सहज ज्ञान युक्त लगता है मुझे।

फिस्ट यह गणितीय notaiton के अनुरूप है क्योंकि: -2^2 = -4।

दूसरा, ऑपरेटर ** व्यापक रूप से FORTRAN लंबे समय पहले से शुरू की गई थी। फोरट्रान में, -2 ** 2 -4 है, साथ ही साथ।

संबंधित मुद्दे