2012-02-17 17 views
6

मैं अजगर की गणितीय क्षमताओं के साथ प्रयोग किया गया है और मैं कुछ रोचक व्यवहार पर आया था। यह निम्न अभिव्यक्ति से संबंधित है:क्यों अजगर को गलत तरीके से इस अभिव्यक्ति मूल्यांकन करता है?

(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 

>>> 415 

हालांकि, अगर आप के मन में आपरेशन के मानक आदेश के साथ अभिव्यक्ति का मूल्यांकन, जवाब 420.25 होना चाहिए। मैंने वोल्फ्राम एल्फा के साथ दो बार चेक किया है, जो 420.25 का उत्तर देता है। पाइथन एक अलग जवाब क्यों दे रहा है? क्या इस तरह के अभिव्यक्तियों का मूल्यांकन करने के साथ इसका कुछ संबंध है? क्या कुछ सम्मेलन है जो इसके बाद है? किसी भी जानकारी की सराहना की जाएगी, धन्यवाद!

+0

मेरा अनुमान है कि पाता है '3/4/5 * 35' अस्पष्ट और इसे दूसरे तरीके से मूल्यांकन करता है की तुलना में आप कर सकते हैं। सर्वश्रेष्ठ में कुछ कोष्ठक रखें – inspectorG4dget

+0

प्रोग्रामिंग भाषा के प्राथमिकता नियम नहीं हो सकते हैं और इस मामले में नियमित गणित के समान नहीं हैं। नियमित गणित में भी अभिव्यक्ति का मूल्यांकन लगभग 415.00428571428574 – ChessMaster

+0

क्या आपने सरल उदाहरण बनाने का प्रयास किया? –

उत्तर

10

आप चल बिन्दु विभाजन का उपयोग करना चाहते। यह करने के लिए इसे बदलने काम करता है:

(4+4)+3.0/4/5*35-(3*(5+7))-6+434+5+5+5 

पूर्णांक विभाजन के कुछ उदाहरण बनाम चल बिन्दु विभाजन:

Python 2.7.2+ (default, Oct 4 2011, 20:06:09) 
>>> 3/4 
0 
>>> 3.0/4 
0.75 
>>> 3.0/4.0 
0.75 

एक पूर्णांक से विभाजित एक नाव एक फ्लोटिंग प्वाइंट ऑपरेशन है। अजगर 3 इस बदल गया है ताकि फ्लोटिंग प्वाइंट विभाजन डिफ़ॉल्ट है:

Python 3.2.2 (default, Sep 5 2011, 21:17:14) 
>>> 3/4 
0.75 
4

अजगर में 2.x/ऑपरेटर पूर्णांक प्रभाग है। यदि आप

(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5 

लिखते हैं तो यह अपेक्षित उत्तर देगा।

4

कि अजगर के संस्करण पर निर्भर करता है आप चला रहे हैं:

$ python3 
Python 3.1.4 (default, Nov 12 2011, 12:16:31) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 

अजगर 3 से पहले, / ऑपरेटर पूर्णांक प्रदर्शन किया फ्लोटिंग पॉइंट के बजाय विभाजन।

7

वजह से, अजगर 2 में, / पूर्णांक विभाजन का उपयोग करता है जब दोनों ऑपरेटर और संकार्य पूर्णांक हैं।

आप एक नाव के लिए एक को बदल सकते हैं या तो (के रूप में अन्य answerers का सुझाव दिया है), या from __future__ import division का उपयोग करें: http://www.python.org/dev/peps/pep-0238/

3

यह पूर्णांक प्रभाग है। अपने उदाहरण में, 3/4 का मूल्यांकन करता है करने के लिए 0. हालांकि, 3.0/4.0 0.75 करने के लिए मूल्यांकन करता है।

>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
415 
>>> (4+4)+3./4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 

यह व्यवहार अजगर संस्करण 3 और उच्चतर में बदल गया था। यदि आप इसे फ़्लोटिंग पॉइंट डिवीजन में डिफ़ॉल्ट करना चाहते हैं, तो आप नियम आयात कर सकते हैं।

>>> from __future__ import division 
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5 
420.25 
1

इसकी सूचना के लिए है कि न तो अजगर या वॉलफ्रेम अल्फा आप के बाद से गणित में हम विभाजन से पहले और अजगर * में गुणा करते हैं और/एक ही पूर्वता तो बाएं से दाएं मूल्यांकन करेंगे है गणितीय सही जवाब नहीं देंगे महत्वपूर्ण।

3.0/4/5*35 # equal 5.25 in python 
3.0/4/5*35 # equal 3.0/4/(5*35) or 0.004285714285714286 in math 
संबंधित मुद्दे