2011-11-08 19 views
6

एक निजी परियोजना के रूप में मैं अपनी पालतू परियोजना के लिए एक मनमानी प्रेसिजन संख्या प्रकार को लागू करने पर काम कर रहा हूं।हाथ से पहले कैसे निर्धारित किया जाए यदि कोई हस्ताक्षरित गणना संभावित रूप से बहती है?

मुझे पहले से ही सभी लोकप्रिय, परीक्षण और मजबूत पुस्तकालयों के बारे में पता है जो ऐसा करते हैं। मैं एक स्व सुधार शिक्षा परियोजना के रूप में समाधान पर काम करना चाहता हूं।

मैं क्षेत्र शोध कर रहा हूँ और यह पता लगाने की अगर वहाँ को किसी तरह से मोटे तौर पर भविष्यवाणी इससे पहले कि मैं वास्तव में गणना करने अगर एक ऑपरेशन एक अतिप्रवाह कारण होगा है कोशिश कर रहा। मैं झूठी सकारात्मकताओं के बारे में इतना चिंतित नहीं हूं।

मैं गणना के लिए उपयुक्त सबसे छोटी जगह का उपयोग करने में सक्षम होना चाहता हूं। यदि गणना इसकी मूल सीमाओं के भीतर रहेगी तो मैं इसे वहां रखूंगा।

उदाहरण के लिए: Multiplying two 64 bit Integers if each are large enough will cause an overflow. मैं इसे पहचानना चाहता हूं और संख्याओं को केवल मेरे नंबर प्रकार में परिवर्तित कर सकता हूं यदि परिणाम संकल्प के 64 बिट से अधिक हो सकता है। मैं इस प्रयोग में पर नंबरों पर हस्ताक्षर कर रहा हूं।

अतिप्रवाह/अंडरफ्लो का पता लगाने के लिए सबसे अधिक सक्षम, कुशल तरीका क्या है?

+0

ने कभी भी इसी तरह की परियोजना की कोशिश नहीं की, इसलिए केवल quesions मिल गया: पहले से बहने के बारे में जानने में क्या बात है? छोटे nmbers के लिए अनुकूलन जल्दी होना चाहिए, या कुछ कम स्पष्ट? यू को एक सटीक समाधान की आवश्यकता है, या उस व्यक्ति को स्वीकार करें जो झूठी अतिप्रवाह अलार्म दे सकता है? – vmatyi

+1

आपके प्रश्न और उत्तर में से किसी एक के जवाब में आपकी टिप्पणी का कहना है कि आप हस्ताक्षरित ऑपरेटरों का उपयोग कर रहे हैं, लेकिन शीर्षक हस्ताक्षरित कहता है। जो यह है?बिना हस्ताक्षर किए गए अंकगणित से निपटने के लिए शायद आसान है, और शायद मनमानी परिशुद्धता संख्याओं के साथ काम करने के लिए अधिक उपयुक्त है। –

+0

मैं बेस घटकों के रूप में बिना हस्ताक्षर किए गए आदिम प्रकारों का उपयोग करके मनमानी गणनाओं पर हस्ताक्षर कर रहा हूं, जैसा कि बेस –

उत्तर

2

दोनों संख्या में केवल उच्चतम बिट ले लो, एक के बाद छोड़ दिया Shift, यदि परिणाम: उन संख्याओं की (जैसे गुणा) एक अतिप्रवाह कारण होगा, तो आप एक अतिप्रवाह के लिए एक अच्छा मौका है।

हालांकि यह सटीक नहीं है, यह तेजस्वी और तेज संकेतक है कि आपको परिणाम के लिए एक बड़ा डेटा प्रकार चाहिए। Undefined behavior when exceed 64 bits

+1

का प्रतिनिधित्व करने वाले हस्ताक्षर किए गए 64 बिट लंबे समय की एक सरणी में 1 क्यों छोड़ा गया है? –

+1

क्योंकि इस तरह आप ओवरफ्लो का कारण बन सकते हैं। यदि वास्तव में ऐसा होता है, तो इसका मतलब है कि आपकी संख्या में से एक पहले से ही बड़ी है। –

2
:

यह केवल बड़े डेटा प्रकार के लिए समझ में जिसके लिए ऑपरेटर महंगा है, साधारण चीजें (यहां तक ​​कि 64 बिट संख्या के लिए) के लिए, मुझे लगता है कि आप CPU के अंतर्निहित गणित पर भरोसा कर सकते .. इस सवाल देख कर सकता है

इसके बारे में जॉन रेगेर का paper है।

0

बेवकूफ गणना करने के लिए यह लगभग हमेशा आसान (और अक्सर तेज़) होता है, और पता चलता है कि अतिप्रवाह हुआ है या नहीं। क्या कोई विशिष्ट कारण है कि आप गणना से पहले गणना का आकलन करना चाहते हैं?

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

यहां एक (बहुत) सरल उदाहरण है: यदि मैं दो हस्ताक्षरित 64-बिट संख्याओं को जोड़ता हूं, तो मैं जोड़ों की तुलना करके ओवरफ्लो की जांच कर सकता हूं - यदि यह छोटा है, तो अतिप्रवाह होने की तुलना में। इस प्रकार, गणना के बाद अतिप्रवाह का पता लगाने के लिए केवल एक ही तुलना की आवश्यकता होती है (वास्तव में बहुत सस्ता)।

+0

आपका उदाहरण केवल हस्ताक्षरित ऑपरेंड के मामले में सच है, यह सामान्य मामले में नहीं है। –

+0

और हस्ताक्षरित अतिप्रवाह का व्यवहार अपरिभाषित है। –

+0

@ केथ: बिल्कुल प्राचीन प्रकार के लिए। ओपी एक मनमाना-परिशुद्धता प्रकार को लागू करने के बारे में बात कर रहा है। उसे प्रतिनिधित्व बढ़ाने के लिए ओवरफ्लो को संभालने में सक्षम होना चाहिए (और इसलिए ओवरफ्लो को रोकें!)। –