2009-06-01 6 views
12

मैं एक पूर्णांक चर है, कि एक मूल्य 4294967295सी ++ में 2^32 से बड़े पूर्णांक के लिए किस प्रकार का उपयोग करना है?

से बड़ा किस प्रकार मैं इसके लिए उपयोग करना चाहिए प्राप्त कर सकते हैं (लंबे, या डबल, या कुछ और)?

+1

क्या यह असाधारण रूप से बड़ा हो सकता है? क्योंकि लोग 64 बिट के मुद्दों पर निवास कर रहे हैं, लेकिन यदि आप उन्हें बताते हैं कि आप खगोलीय दूरी, या परमाणुओं की गिनती को देख रहे हैं, तो उत्तर जल्दी से "डबल" में बदल जाता है, पूर्णांक भूल जाता है। – jpinto3912

+0

ग्रेट टिप्पणी! मेरे मामले में यह 64 बिट से बड़ा नहीं मिलता है, लेकिन यह अभी भी दिलचस्प है, अगर ऐसा होता है तो क्या करना है? ऐसे मामले में मुझे "डबल" का उपयोग क्यों करना चाहिए? –

उत्तर

8

सी ++ में ऐसा करने का कोई पोर्टेबल तरीका नहीं है, क्योंकि भाषा पूर्णांक प्रकारों का आकार निर्दिष्ट नहीं करती है (आकार के चार को छोड़कर 1 है)। आपको अपने कंपाइलर दस्तावेज़ों से परामर्श करने की आवश्यकता है।

+5

रिकॉर्ड के लिए बिल्कुल सही नहीं है। मानक प्रत्येक प्रकार के कम से कम परिमाण निर्दिष्ट करता है और इस प्रकार निहितार्थ से कम से कम बिट (नहीं बाइट) http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and देखने गिनती -एक लंबी-इन-सी/271,132 # 271,132 –

+1

सी ++ 11 के बाद से वहाँ 'लंबी long' और' अहस्ताक्षरित लंबे long' प्रकार जो कम से कम 64 बिट विस्तृत और उनके संबंधित 'll', ull होने की गारंटी दी जाती है' 'अक्षर इसके अलावा 'cstdint' शीर्षक में वहाँ' int64_t', 'int_least64_t',' int_fast64_t', 'uint64_t',' uint_least64_t', 'uint_fast64_t' प्रकार उपनाम उपलब्ध हैं। –

0

डबल्स फ़्लोटिंग-पॉइंट हैं। आपको लंबे समय तक लंबे समय तक उपयोग करना चाहिए। मुझे नहीं पता कि कौन सा उपनाम पसंदीदा है।

13

long long का उपयोग करें और यदि संभव हो तो संकलन-समय का दावा जोड़ें कि यह प्रकार काफी व्यापक है (sizeof(long long) >= 8 की तरह smth)।

double फ़्लोटिंग-पॉइंट के लिए है, पूर्णांक नहीं।

+9

लंबे समय तक मानक सी ++ डेटा प्रकार –

+5

आईएसओ/आईईसी 9899 के अनुसार नहीं है: टीसी 3 - कमेटी ड्राफ्ट - सेपरबर्ग 7, 2007 - पिछले संस्करण के प्रमुख परिवर्तनों में शामिल हैं: लंबे लंबे int प्रकार और लाइब्रेरी फ़ंक्शन अधिकतम मूल्य प्रकार का ऑब्जेक्ट लंबा लंबा int LLONG_MAX 9223372036854775807 (2^63 - 1) –

+4

यह एक सी 99 दस्तावेज़ है, सी ++ नहीं। –

1

यदि आपको ऋणात्मक संख्या की आवश्यकता नहीं है, तो आप जितनी अधिक प्राप्त कर सकते हैं उतनी लंबी लंबी आवाजें।

12

प्रयास करें:

http://gmplib.org/ बड़ा संख्या।

http://mattmccutchen.net/bigint/ बड़ा int।

मैंने न तो उपयोग किया है, लेकिन मैंने जावा में समान चीजों का उपयोग किया है।

+0

gmplib महान +1 – dfa

+0

शानदार उत्तर है! – tekknolagi

2

मैं

uint64_t 

का उपयोग लेकिन यह मानक नहीं है।

+1

दरअसल stdint.h सी 99 का हिस्सा है। लेकिन कई कंपाइलर विक्रेता 10 साल बाद भी "नए" मानक का समर्थन करने में सक्षम हैं (किसी को याद है कि आईटी 10 साल पहले कैसा दिखता था ?!)। – lispmachine

+0

मुझे आपके काम के बारे में पता नहीं है, लेकिन मेरे लिए, केवल तीन कंपाइलर विक्रेता मायने रखते हैं। माइक्रोसॉफ्ट, इंटेल, और जीसीसी। और तीनों ने पारंपरिक रूप से "नए" मानक अनुपालन में अच्छा प्रदर्शन किया है। नहीं इतना SUNW सी ++ या हिमाचल प्रदेश या आईबीएम, लेकिन विंडोज़/लिनक्स दुनिया में, यह एक गैर मुद्दा होना चाहिए। 15 साल पहले, मुझे नाश्ते के लिए कंपाइलर और लिंकर्स तोड़ना याद है। वास्तव में, यह एक लिंकर बग को ठीक करने के लिए डीईसी को दो महीने का बेहतर हिस्सा ले गया ताकि हम विंडोज़ अल्फा के लिए प्रो/इंजीनियर को भेज सकें, उन दिनों में जब 32 एमबी निष्पादन योग्य अनजान थे। –

0

अपने संकलक लंबे नहीं है, तो आप उन्हें अपने आप को एक संरचना दो लंबे युक्त साथ लागू कर सकते हैं, लेकिन आप आप GMP

3

की तरह एक एकाधिक प्रेसिजन अंकगणित के लिए पाठ्यक्रम देखो की सका होने की आवश्यकता होगी caurseful साथ ले जाने आदि दोनों प्रस्ताव अच्छे नहीं हैं क्योंकि लंबे समय तक मानक सी ++ डेटा प्रकार नहीं है, और डबल एक फ्लोटिंग पॉइंट है।

चूंकि मेरे कार्यक्रम पोर्टेबल हो गया है, मैं अपने ही प्रकार, कि सूट सभी compilers है कि मैं का उपयोग करें (दृश्य स्टूडियो और जीसीसी) #define करने जा रहा हूँ:

#ifdef WIN32 
    #define unsigned_long_long unsigned __int64 
    #define long_long __int64 
#else // gcc. Might not work on other compilers! 
    #define unsigned_long_long unsigned long long 
    #define long_long long long 
#endif 
+1

ध्यान दें कि यह एक विंडोज़ मुद्दा नहीं है, यह एक सी ++ मानक मुद्दा है - इस बात की कोई गारंटी नहीं है कि गैर-विंडोज प्लेटफार्म लंबे समय तक समर्थन करेंगे। –

+0

एमएसडीएन के अनुसार लंबे समय तक वीसी ++ में __int64 के बराबर है और इसलिए आपको परिभाषित करने की आवश्यकता नहीं है। – sharptooth

+0

यह भी ध्यान दें कि जी ++ बहुत सी चेतावनियों को छोड़ देगा अगर -पीडेंटिक के साथ संकलित किया गया है, जो मुझे लगता है कि अधिकांश सी ++ प्रोग्राम हैं (वे निश्चित रूप से होना चाहिए) –

1

TTMath की कोशिश करो। तुम सब करने की ज़रूरत है एक भी शीर्ष लेख शामिल है और फिर इस तरह के रूप में एक bignum प्रकार की घोषणा:

typedef ttmath::UInt<100> BigInt; 

जो एक प्रकार है कि दोनों के बीच 0 और 2^(32 * 100) -1 अहस्ताक्षरित पूर्णांकों धारण कर सकते हैं बनाता है। फिर BigInt का उपयोग करें जहां आप int का उपयोग करेंगे।

बेशक आप टेम्पलेट पैरामीटर के लिए जो भी आकार पसंद करते हैं उसे चुन सकते हैं। 100 ओवरकिल हो सकता है ;-)

बस एहसास हुआ, lib केवल x86 और x64 पर काम करता है, लेकिन उन प्रोसेसर पर ओएस क्रॉस-प्लेटफार्म है।

+0

मैं ttmath का उपयोग करने की कोशिश कर रहा हूं और आपने जो कहा वह इस्तेमाल किया। आपने कहा कि उसे उस स्थान पर BigInt का उपयोग करने की आवश्यकता होगी जहां वह इंट का उपयोग करेगा लेकिन तथ्यों यह है कि मुझे यह त्रुटि मिलती है "कक्षा बिगइंट के पास कोई सदस्य नहीं है ...", आपको ऐसा क्यों लगता है? – wxiiir

+0

@wxiir आपने अपनी दूसरी पोस्ट में कहा था कि आपको एक त्रुटि मिल रही है कि 'बिगइंट के पास ब्लाह नाम का कोई सदस्य नहीं है' जब आपके चर का नाम 'ब्लाह' रखा गया था (जो नहीं होना चाहिए)। क्या होता है आप एक सरल घोषणा की कोशिश करते हैं जैसे 'ttmath :: UInt <100> blah = 0; blah = blah + 10; '? – HostileFork

3

डबल का उपयोग न करें, क्योंकि:

cout.setf(ios::fixed); 
cout << LONG_LONG_MAX << endl; 
cout << double(LONG_LONG_MAX) << endl; 

cout << LONG_LONG_MAX-100 << endl; 
cout << double(LONG_LONG_MAX-100) << endl; 

आउटपुट:

9223372036854775807 
9223372036854775808.000000 
9223372036854775707 
9223372036854775808.000000 
+0

हां, एक्सपोनेंट की पहचान करने के लिए बिट्स में से कुछ दोगुना होगा, वास्तव में सटीक खोना (जैसा कि एक ही आकार के पूर्णांक प्रकार की तुलना में) –

1

वर्तमान सी का एक बहुत/C++ compilers या तो stdint.h या inttypes.h हैडर की है।

int_fast64_t या int64_t एक विकल्प हो सकता है (IMHO सबसे पोर्टेबल)।

7

मुझे लगता है कि आपकी संख्या 64 बिट्स में फिट होगी। यदि नहीं, तो आपको arbitrary-precision arithmetic library जैसे GMP की आवश्यकता है।

सिद्धांत रूप में, सी ++ में 64-बिट गणित करने के लिए कोई आसान, पोर्टेबल तरीका नहीं है। प्रैक्टिस में, अधिकांश सी ++ कंपाइलर्स "पुराने फैशन" सी हेडर का भी समर्थन करते हैं, और सी 99 में stdint.h नामक एक अच्छा हेडर है।

तो पहला कार्य करें:

#include <stdint.h> 

फिर प्रकार int64_t का उपयोग (हस्ताक्षरित) और uint64_t (अहस्ताक्षरित)।

1

आपका प्रोग्राम कितना पोर्टेबल होना चाहिए? टीआर 1 में cstdint और stdint.h है इसलिए यह सबसे अद्यतित कंपाइलर्स द्वारा समर्थित है। फिर बूस्ट cstdint.hpp है कि अगर cstdint समर्थित नहीं है तो आप इसका उपयोग करने में सक्षम होना चाहिए।

0

जिज्ञासा से बाहर - मुझे नहीं लगता कि अगर आप चाहें तो अपने आप को कोड करना मुश्किल होगा। मेरा मतलब है, इन सभी डेटा प्रकारों ने पूर्वनिर्धारित संरचनाएं हैं, उदाहरण के लिए, उदाहरण के लिए, double संरचना का उपयोग करें जो एक्सपोनेंट का उपयोग करता है, और इस तरह कुछ करें:

स्केल से परे बहुत बड़ी संख्या को पकड़ने के लिए एक डबल की, एक वस्तु इसे करने के लिए दो भाग हैं कि बना सकते हैं - संख्या और दस के लिए बिजली,

इसलिए, अगर आप की तरह

1,123x 10^(100000000000000000000000000000000000) है, जो isn कुछ स्टोर करने के लिए करना चाहता था ' टी डबल द्वारा समर्थित, आपके पास 1.123 ... भाग डबल में संग्रहीत किया जा सकता है, और उसके बाद दस की शक्ति एक अलग डबल/int/float (जो कुछ भी सूट) के रूप में हो सकती है, और फिर उसे वहां से ले जाएं। बेशक, यह सबसे अच्छा तरीका नहीं हो सकता है - और आपको शायद विभाजन, घटाव आदि के लिए बहुत सारी कार्यक्षमता में कोड करना होगा, लेकिन यह निश्चित रूप से पोर्टेबल द्वारा होगा, क्योंकि आप परिभाषित सामान्य डेटा प्रकारों का उपयोग करेंगे। इसकी उपयोगिता उस चीज़ पर निर्भर करेगी जिसे आप हासिल करने की कोशिश कर रहे हैं और चाहे आप इसे एक परियोजना से परे उपयोग करने की योजना बना रहे हों या नहीं, लेकिन मुझे लगता है कि यह करने का एक उत्तरदायी तरीका है यदि संख्याओं की एक पूर्ण आवश्यकता है

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

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