2013-01-31 18 views
6

में पूर्णांक प्रकार को कैसे सारणित करें मैं एल्गोरिदम के साथ गणितीय सॉफ़्टवेयर डिज़ाइन कर रहा हूं जो जेनेरिक पूर्णांक प्रकारों जैसे मशीन इन्ट्स या जीएमपी पूर्णांक के लिए काम करता है। प्रदर्शन के लिए आमतौर पर मशीन कीट के साथ काम करना चाहता है, लेकिन यदि ओवरफ्लो है, तो कोई भी जीएमपी पर स्विच करने की कोशिश कर सकता है; आदर्श समय पर रनटाइम पर। अब तक पूरा प्रोग्राम पूर्णांक प्रकार पर टेम्पलेट के रूप में लिखा गया है। जैसे ही लाइब्रेरी बढ़ती है, दर्द बढ़ता है:गणितीय सॉफ़्टवेयर

  • संकलन समय और स्मृति खपत हाथ से बाहर हो रही है।
  • संकलन समय पर त्रुटि संदेश कम उपयोगी हैं।
  • डीबगिंग अधिक दर्दनाक है।
  • पूरा कोड हेडर फाइलों में है।

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

संक्षिप्त प्रश्न यह होगा: परिस्थितियों के लिए डिज़ाइन पैटर्न क्या हैं जिनमें लगभग संपूर्ण प्रोग्राम एक प्रकार पर निर्भर करता है?

+3

समय से पहले अनुकूलित न करें (Knuth) - जीएमपी (जीएनयू एकाधिक प्रेसिजन अंकगणित लाइब्रेरी) प्रदर्शन के लिए छोटे 'int' को संभालने और आवश्यक होने पर बड़े पैमाने पर स्केल करने में काफी अच्छा है। इसे फिर से शुरू करने की कोशिश मत करो! – danodonovan

उत्तर

4

GNU Multiple Precision Arithmetic Library

ध्यान से यथासंभव शीघ्र करने के लिए डिज़ाइन किया गया है, दोनों छोटे ऑपरेंड के लिए और विशाल ऑपरेंड के लिए।

दूसरे शब्दों में, यदि आप जीएमपी लाइब्रेरी का उपयोग करते हैं तो यह आपके लिए इन कठिनाइयों को संभालेगा, और आपको बहुत प्रयास करेगा!

+1

ठीक है, यह एक अलग जटिलता वर्ग नहीं है, लेकिन मैं पूर्ण समस्या के बजाय जीएमपी पूर्णांक का उपयोग करते समय एक ही समस्या पर 3-4 गुना अधिक रन माप रहा हूं। – Thomas

+0

@ थॉमस क्या मानक मानक पूर्णांक का उपयोग करते समय वह कोड सही काम करता है? यदि 'मानक' कोड हर समय आसानी से बहता है, जबकि जीएमपी कोड को परिणामों को सही रखने के लिए संख्याओं के आंतरिक प्रतिनिधित्वों का विस्तार करना होता है, तो यह अंतर समझाएगा। – us2012

+0

कोई ओवरफ़्लो नहीं। ऐसी परिस्थिति में जहां मशीन पूर्णांक पर्याप्त जीएमपी हमें 3-4 के कारक से धीमा कर देता है। – Thomas

2

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

इसलिए मैंने अनिवार्य रूप से एक अपरिपक्व पूर्णांक पर एक रैपर वर्ग लिखा (std::aligned_storage का उपयोग करके पिंपल के साथ)। बैक एंड संकलन समय के दौरान चुना जा सकता है।

यह टेम्पलेट से छुटकारा पाता है और मेरे लिए पर्याप्त लचीलापन देता है।

+0

यदि मैं आपको सही ढंग से समझता हूं तो यह मूल रूप से समाधान है जिसे मैंने पहले ही प्रश्न में वर्णित किया है? क्या आप अपने कार्यान्वयन पर थोड़ा और विस्तार कर सकते हैं? मैं बस 'टाइपपीफ कुछ इंटेगर टाइप' का एक गुच्छा करता हूं जिसमें से एक संकलन समय पर सक्रिय हो जाता है और फिर पूरे इंटीजर टाइप का उपयोग करता है। मुझे pimpl या aligned_storage की आवश्यकता क्यों है? – Thomas

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