2009-05-06 27 views
9

हम गणना करने के लिए अपेक्षा की जाती है का उपयोग किए बिना ई^x सूत्र इस तरह का उपयोग करते हुए:गिना जा रहा है ई^x किसी भी कार्यों

ई^x = 1 + (! X^1/1) + (x^2/2 !) ......

मैं इस कोड अब तक है:

while (result >= 1.0E-20) 
{ 
    power = power * input; 
    factorial = factorial * counter; 
    result = power/factorial; 
    eValue += result; 
    counter++; 
    iterations++; 
} 

मेरे समस्या अब है कि के बाद से भाज्य लंबे प्रकार का है, मैं वास्तव में 20 से बड़ी संख्या स्टोर कर सकते हैं है ! 8.21840746155e + 307

कार्यक्रम: तो क्या होता है कि इस कार्यक्रम के आउटपुट अजीब संख्या है जब यह उस बिंदु तक पहुँच जाता है ..

सही समाधान के अधिक से अधिक 709 तो ई^709 होना चाहिए उत्पादन एक एक्स मूल्य हो सकता है सी ++ में लिखा गया है।

+1

क्यों फैक्टोरियल डबल नहीं बनाते? –

उत्तर

32

दोनों x^n और n! जल्दी से बड़े (बड़े पैमाने पर और superexponentially क्रमशः) के साथ बड़े हो जाना और जल्द ही आपके द्वारा उपयोग किए जाने वाले किसी भी डेटा प्रकार को बह जाएगा। दूसरी ओर, एक्स^एन/एन! नीचे चला जाता है (अंत में) और जब आप छोटे होते हैं तो आप रुक सकते हैं। यही है, इस तथ्य का उपयोग करें कि x^(एन + 1)/(एन + 1)! = (x^एन/एन!) * (एक्स/(एन + 1))। इस तरह, कहते हैं:

term = 1.0; 
for(n=1; term >= 1.0E-10; n++) 
{ 
    eValue += term; 
    term = term * x/n; 
} 

(कोड इस बॉक्स में सीधे लिखी, लेकिन मैं इसे काम करना चाहिए उम्मीद है।)

संपादित करें: ध्यान दें कि शब्द x^n/n! बड़े एक्स के लिए, थोड़ी देर के लिए बढ़ रहा है और फिर घट रहा है। X = 70 9 के लिए, यह 0 से कम होने से पहले ~ 1e + 306 तक जाता है, जो कि double की सीमाओं पर है (double की रेंज ~ 1e308 और term*x इसे धक्का देता है), लेकिन long double ठीक काम करता है। बेशक, आपका अंतिम परिणामx किसी भी शर्तों से बड़ा है, इसलिए मान लें कि आप परिणाम को समायोजित करने के लिए पर्याप्त डेटा प्रकार का उपयोग कर रहे हैं, तो आप ठीक होंगे।

(x = 709 के लिए, आप यहां से मात्र double अगर आप term = term/n * x का उपयोग का उपयोग कर के साथ प्राप्त कर सकते हैं, लेकिन यह 710 के लिए काम नहीं करता है)

+0

+1 है: मुझे यह करने के लिए मारो! – gnovice

+0

घने होने के लिए खेद है लेकिन मुझे यह नहीं मिल रहा है .. जब मैं 70 9 के साथ एक्स को प्रतिस्थापित करता हूं, तो जवाब 1.8046..e + 016 –

+0

हाँ, मैंने इसे संबोधित करने के उत्तर में एक नोट जोड़ा। एक्स = 70 9 क्या डबल संभाल सकता है की सीमा पर है। – ShreevatsaR

4

क्या होता है यदि आप factoriallong long से double पर बदलते हैं तो क्या होता है?

+0

प्रकार पर दो उत्पादन के भाज्य के साथ ई^709 गणना करने के लिए कोशिश कर रहा है:। -1 # आईएनडी और अधिकतम यात्रा मैं लगता है कि 172 –

1

तुम यहाँ क्या प्रस्तुत बहुआयामी पद गणना करने के लिए Horner scheme का एक आवेदन पत्र है।

2

मैं एक और समाधान के बारे में सोच सकता हूं। pow(e,x) = pow(10, m) * b करते हैं जहां b>=1 और < 10 है, तो

m = trunc(x * log10(e)) 

जहां log10(e) में एक निरंतर कारक है।

और

b = pow(e,x)/pow(10, m) = pow(e,x)/pow(e,m/log10(e)) = pow (e,x-m/log10(e)) 

इस से आपको मिलेगा:

z = x-m/log10(e) 

जो 3 करने के लिए 0 के बीच में हो जाएगा और उसके बाद b = pow(e,z) का उपयोग SreevartsR द्वारा दिए गए के रूप में।

और अंतिम जवाब

ख आधार (सार्थक अंक) और मीटर है अपूर्णांश (परिमाण के क्रम) है।

यह श्रीवार्ट्स दृष्टिकोण से तेज़ होगा और आपको उच्च परिशुद्धता का उपयोग करने की आवश्यकता नहीं हो सकती है।

शुभकामनाएं।

यह और भी, जब एक्स 0 की तुलना में कम है और एक बड़ा नकारात्मक है के लिए काम करेंगे में उस मामले z -3 0 के बीच में होगा और यह किसी भी अन्य दृष्टिकोण से भी तेज हो जाएगा।

जेड के बाद से 3 -3 है, और यदि आप पहले 20 महत्वपूर्ण अंक की आवश्यकता होती है, तो पॉव (ई, जेड) अभिव्यक्ति केवल 3^37/37 के बाद से तक 37 मामले का मूल्यांकन किया जा सकता है! = ~ 3.2e-26।

+0

निश्चित रूप से यह तेज़ होगा - 'एक्सपी (एक्स)' लिखना भी तेज़ होगा - लेकिन यह किसी भी फ़ंक्शन का उपयोग किये बिना "गणना ई^एक्स" की आवश्यकता को पूरा नहीं करता है। :-) – ShreevatsaR

+0

@ श्रीवत्सरा: असल में, मुझे लगता है कि यह करता है - भले ही मैं आधार -10 में गणना से कोई लाभ नहीं देख पा रहा हूं। यह समाधान _any functions_ का उपयोग कहां करता है? – jpalecek

+0

@jpalecek: पाउ() एक अंतर्निहित फ़ंक्शन है, जैसे एक्स()। मुझे लगता है कि मूल पोस्टर का इरादा एक्स * (या अन्य ऐसे कार्यों का उपयोग करने के लिए * नहीं * था (या यहां तक ​​कि, शायद, दिए गए श्रृंखला का उपयोग करना था)। – ShreevatsaR