2015-06-10 22 views
8

के बीच अंतर प्रोग्रामिंग के दौरान मैंने math.exp (2) और math.e ** 2 के परिणाम के बीच एक अंतर देखा। जैसा कि आप नीचे देख सकते हैं, ई^1 की गणना करते समय यह अंतर उत्पन्न नहीं होता है।math.exp (2) और math.e ** 2

अनुभवी प्रोग्रामर नहीं होने पर, मुझे आश्चर्य हुआ कि यह क्यों अलग है? मुझे लगता है कि इसे गोल करने के साथ कुछ करना है। पायथन दस्तावेज़ कहते हैं कि math.exp(x) वापसी e**x, लेकिन ऐसा लगता है कि यह बिल्कुल सही नहीं है। तो कैसे math.exp(x) ऑपरेशन math.e**x से अलग है?

>>> math.exp(1) 
2.718281828459045 
>>> math.e**1 
2.718281828459045 
>>> math.exp(1)==math.e**1 
True 
>>> math.exp(2) 
7.38905609893065 
>>> math.e**2 
7.3890560989306495 
>>> math.exp(2)==math.e**2 
False 
>>> math.exp(100) 
2.6881171418161356e+43 
>>> math.e**100 
2.6881171418161212e+43 
>>> math.exp(100)==math.e**100 
False 
+2

संबंधित: http://stackoverflow.com/a/15322395/1639625 मेरा अनुमान है: 'math.exp'' c' (या हार्डवेयर में भी) में लागू किया गया है और इस प्रकार थोड़ा अलग फ़्लोटिंग पॉइंट व्यवहार है। –

+1

फिर से खोलने के लिए वोटिंग। बस "फ़्लोटिंग-पॉइंट गलत है" की तुलना में यहां और अधिक चल रहा है। विशेष रूप से, जैसा कि दो उत्तरों समझाते हैं, 'e ** x' की तुलना में' exp (x) 'अधिक सटीक होने की अपेक्षा करने के अच्छे कारण हैं। –

उत्तर

4

कार्यों के कार्यान्वयन में मतभेदों के कारण यह अलग है। फ्लोटिंग पॉइंट की प्रकृति के कारण कोई भी सही नहीं है।

** ऑपरेटर floatobject.c में कार्यान्वित किया गया है और इसमें बहुत से विशेष मामले हैं, लेकिन इनमें से कोई भी यहां शामिल नहीं है, इसलिए यह अंततः मानक सी pow फ़ंक्शन तक पहुंच जाता है। math.pow फ़ंक्शन अंततः वही काम करता है।

exp फ़ंक्शन उसी नाम के सी फ़ंक्शन के चारों ओर एक सीधा लपेटा है, जिसे mathmodule.c में मैक्रो के साथ परिभाषित किया गया है।

जैसा कि होता है, एक्सप अधिक सटीक होता है (दोनों परिणाम मिलान होते हैं, फ्लोटिंग पॉइंट द्वारा अनुमत परिशुद्धता के भीतर, उच्च परिशुद्धता उत्तरों जिन्हें मैं बीसी में गणना करता हूं)। अधिकांश ऐसा इसलिए है क्योंकि आंतरिक पाउ को, तो यह आपको पहले तर्क, जो थोड़ा 1.


की तुलना में छोटे मौलिक मुद्दा यह है कि है के रूप में पारित डबल परिशुद्धता e मूल्य की विस्तारित परिशुद्धता लघुगणक गणना कर रहा है की संभावना math.e, जो नंबर पर आप की शक्ति की गणना कर रहे हैं, यह है:

2.718281828459045 09079559829... 

जबकि की वास्तविक मूल्य

2.718281828459045 23536028747... 
है

और जब आप pow या ** का उपयोग करते हैं, तो यह त्रुटि जटिल होती है, जबकि यह exp का उपयोग कर रहे एल्गोरिदम के विवरण के कारण हो सकता है, जबकि यह हो सकता है (या आंतरिक रूप से उच्च परिशुद्धता मान का उपयोग नहीं कर सकता)।

+0

मेरी समझ के लिए: बीसी क्या है? – oscarwhiskybravo

+0

@ rosie2go यह यूनिक्स और लिनक्स सिस्टम के लिए एक मनमाना-परिशुद्धता कमांड लाइन कैलक्यूलेटर है - क्योंकि यह मनमानी परिशुद्धता है, मैं इसे 50 अंकों की गणना करने के लिए सेट कर सकता हूं और उस परिणाम की तुलना पाइथन फ्लोट परिणाम के साथ कर सकता हूं। – Random832

+0

तो पूर्णांक 1 0.9 99 99 99 99 99 99 99 9468198834395860075119344401173293590545654296875 बन जाता है जब आप इसे एक फ्लोट के रूप में बदलते हैं? – oscarwhiskybravo

5

exp(x)e**x तुलना में काफी कम स्तर पर लागू किया जाता है। यह libc में एक समारोह के लिए अनिवार्य रूप से एक रैपर है। कहा गया है कि संभवतः मूल्य की गणना करने के लिए Taylor series विस्तार का उपयोग करके फ़ंक्शन संभवतः (कुछ स्तर पर) (या संभवतः कुछ अन्य गणितीय विधि, मुझे यकीन नहीं है)।

दूसरी ओर, e**x एक संख्या ले रहा है और इसे एक शक्ति में बढ़ा रहा है। यह एक पूरी तरह से अलग रणनीति है, और शायद ज्यादातर परिस्थितियों में कम सटीक है। शक्तियों को संख्या बढ़ाना ठीक से करना मुश्किल है।

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