2008-11-05 12 views
19

मैं 2^1000 कर रहा हूँ और इस हो रही है:बड़ी संख्या के लिए वैज्ञानिक नोटेशन से कैसे बचें?

1.07151e + 301

वहाँ किसी भी तरह से वास्तव में बिना ई + 301 एक उचित संख्या में इस बारी करने के है या कम से कम किसी को भी मुझे दिखा सकते हैं जहां मैं कैसे एक वास्तविक संख्या को यह बारी करने के लिए, किसी तरह से ई + 301 भाग के साथ काम करने

धन्यवाद

+0

क्या यह यहां से आ रहा है? http://projecteuler.net/index.php?section=problems&id=16 –

+1

बाइनरी में यह आसान है - 1 के बाद 1000 शून्य। लंबे विभाजन करने के लिए एक सरल एल्गोरिदम बनाएं और आपको क्रमबद्ध करें (बार-बार 1010 तक विभाजित करें और रहने वाले को जोड़ दें)। – Skizz

+0

यह _is_ एक उचित संख्या है। –

उत्तर

9

तो, मैं सोच रहा हूँ कि क्या आप वास्तव में चाहते हैं सिर्फ वैज्ञानिक संकेतन के बिना इसे प्रिंट करने की क्षमता है। आप printf उपयोग कर रहे हैं, क्या आप चाहते हैं: आप दो (2^1000 बनाम 10,715 की एक शक्ति के रूप में यह प्रिंट करना चाहते हैं

cout.setf(ios::fixed); 
cout << setprecision(0) << value; 

:

printf("%f1000.0", value); 
// note that 1000 is way larger than need be, 
// I'm just too lazy to count the digits 

cout के साथ, की तरह कुछ कोशिश ...), आप अपने दम पर कर रहे हैं।

+0

धन्यवाद यह वास्तव में सही संख्या दिखाता है :) – AntonioCS

+0

क्या कोई तरीका है कि मैं इसे स्क्रीन पर प्रिंट करने की बजाय स्ट्रिंग में आउटपुट रख सकता हूं ?? – AntonioCS

+1

बस snprintf का उपयोग करें। ध्यान दें कि चूंकि यह संख्या केवल दो की शक्ति है, इसलिए आप कोई जानकारी नहीं खोते हैं, लेकिन यदि आप 3^1000 के साथ एक ही चीज़ को आजमाते हैं, तो एक डबल सभी आवश्यक परिशुद्धता को स्टोर करने में सक्षम नहीं होगा। – Eclipse

10

आप एक नंबर वर्ग विशेष रूप से लंबे समय तक नंबर के लिए बनाया गया उपयोग करने की आवश्यकता द्वारा देख सकते हैं।

परिभाषा के अनुसार 2^1000 को सटीक संख्या के रूप में प्रस्तुत करने के लिए आपको एक संख्या प्रारूप की आवश्यकता है जिसमें वास्तव में 1001 बाइनरी बिट्स हों। सबसे लंबा सामान्य आदिम पूर्णांक प्रारूप आमतौर पर केवल 64 बिट्स होता है।

Btw, जवाब है:

% perl -Mbigint -e 'print 2**1000' 
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
+0

ऑफ-बाय-वन त्रुटि को सही करने के लिए तय – Alnitak

+1

यदि आप एमबीजिंट से पर्ल लेने का प्रयास करते हैं, तो प्रेत आपको हरा देगा और उन्हें वापस दे देगा। पिग्मी जनजातियों को लूटना अच्छा नहीं है। जब तक आप इंडियाना जोन्स नहीं हैं। –

+0

मुझे लगता है कि आप यह जानते हैं, लेकिन यह एक परियोजना यूलर प्रश्न है। कुछ लोग इस समाधान को स्पष्ट रूप से स्पष्ट करने के लिए थोड़ा विचलित मान सकते हैं। – Beska

0

आप के रूप में सटीक हो रही है चर प्रकार के रूप में एक नंबर का समर्थन कर सकते हैं। वह संख्या 1 के क्रम में 301 शून्य के बाद है। एक सटीक संख्या प्राप्त करने के लिए आपको बड़ी संख्या में समर्थन करने वाली लाइब्रेरी के साथ काम करना होगा, या उस तरह के गणित (मेपल, मैटलैब, आदि) के लिए बनाई गई भाषा के साथ काम करना होगा

13

कैसे एक व्यावहारिक सीमा है बड़ी संख्या में मशीन रजिस्टरों में सीधे छेड़छाड़ की जा सकती है। यदि आप डबल परिशुद्धता फ्लोट का उपयोग कर रहे हैं तो कुल 64 बिट्स हैं, जिनमें से कुछ मंटिसा को समर्पित हैं, कुछ एक्सपोनेंट के लिए हैं, और 1 साइन बिट पर हैं।

2^1000 को सटीक खोए बिना 1001 बिट पूर्णांक की आवश्यकता होती है। इस तरह की संख्याओं के साथ काम करने के लिए आपको उस लाइब्रेरी का उपयोग करने की आवश्यकता होगी जिसमें बड़ी संख्या में समर्थन है, जैसे कि GNU MP

+1

1001 बिट्स, वास्तव में :) 2^1 की आवश्यकता 2 बिट्स; और वहां से प्रेरण से। –

+0

आप सही हैं, इसे इंगित करने के लिए धन्यवाद, मैंने इसे प्रतिबिंबित करने के लिए संपादित किया। –

+0

समापन को पहली वाक्य से काटा जाना प्रतीत होता है: "एक मूलभूत सीमा है कि कितनी बड़ी संख्या हो सकती है" वास्तव में कहनी चाहिए "एक मशीन पंजीकरण में कितनी बड़ी संख्या में प्रतिनिधित्व किया जा सकता है इस पर एक _practical_ सीमा है । " – florin

2

cout < < निश्चित < < your_number;

लेकिन यह शायद पूरी संख्या नहीं दिखाएगा। जैसा कि किसी ने पहले कहा था, आपको कक्षा लिखनी होगी।

4

यदि आप इसे स्वयं C++ में करना चाहते हैं, तो आप उदाहरण के लिए एक अंक सरणी बना सकते हैं और गणना स्वयं कर सकते हैं। परीक्षण और सत्यापित उदाहरण:

unsigned int result[400]; // result digits 
unsigned int i, j, carry; 

// Initialize result digits 
for (i = 0; i < 399; i++) { 
    result[i] = 0; 
} 
result[399] = 2; 

for (i = 2; i <= 1000; i++) { // Calculate 2^i 
    carry = 0; 
    for (j = 399; j > 0; j--) { 
    result[j] <<= 1; // multiply with 2 
    result[j] += carry; // add carry 
    carry = result[j]/10; 
    result[j] %= 10; // we want one digit (0-9) only 
    } 
} 

printf("2^1000 = "); 
// print result digits 
for (i = 0; i < 400; i++) { 
    if (result[i] != 0) { // no leading zeros, please 
    for (j = i; j < 400; j++) { 
     printf("%d", result[j]); 
    } 
    break; 
    } 
} 
printf("\n"); 
2

एक विकल्प है, अगर आपके आवेदन तर्क की अनुमति देगा यह इकाइयों को बदलने के लिए आप जोड़ तोड़ कर रहे हैं ....

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

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

-1

हैडर limits.h और cmath.h

cout.precision(0); 
cout<< fixed<< pow(2,31);    //OR ANY NUMBER HERE 

उपयोग cout.precision परिशुद्धता स्थापित करने के लिए शामिल करें।

+0

यह समाधान लगभग एक दशक पहले यहां दिया गया था। –

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

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