2013-06-06 14 views
5

निश्चित बिंदु गणित में मैं बहुत से 16 बिट सिग्नल का उपयोग करता हूं और 32 बिट इंटरमीडिएट परिणामों के साथ गुणा करता हूं। उदाहरण के लिए:हस्ताक्षरित और हस्ताक्षरित पूर्णांक गुणा

int16_t a = 16384; //-1.0q14 or 1.0*2^14 
int16_t b = -24576; // -1.4q14 or 1.4*2^14 
int16_t c; // result will be q14 

c = (int16_t)(((int32_t)a * (int32_t)b)>>14); 

आइए कहें कि एक q14 संख्या है तो सी के समान स्केलिंग है।

यह ठीक है और हस्ताक्षरित और हस्ताक्षरित अंकगणित के लिए काम करता है।

सवाल यह है: यदि मैं प्रकारों को मिश्रण करना चाहता हूं तो क्या होता है? उदाहरण के लिए यदि मुझे पता है कि गुणक "ए" हमेशा 0.0 से 1.0 तक की दूरी पर जा रहा है, तो यह परिशुद्धता का अतिरिक्त बिट प्राप्त करने के लिए एक अनगिनत int q15 बनाने के लिए मोहक है (और शिफ्ट गणना को 15 में बदलें)। हालांकि, मैंने कभी नहीं समझा कि क्या होता है यदि आप सी में हस्ताक्षरित और हस्ताक्षरित संख्याओं को गुणा करने का प्रयास करते हैं और इससे बचा है। एएसएम में मुझे याद नहीं है कि एक गुणा निर्देश है जो किसी भी आर्किटेक्चर पर मिश्रित प्रकारों के साथ काम करेगा, इसलिए यदि सी सही काम करता है तो भी मुझे यकीन नहीं है कि यह कुशल कोड उत्पन्न करेगा।

क्या मुझे निश्चित बिंदु कोड में हस्ताक्षरित प्रकारों पर हस्ताक्षर किए गए मिश्रण को मिश्रित करने का अपना अभ्यास जारी रखना चाहिए? या यह अच्छी तरह से काम कर सकते हैं?

+2

यह पोस्ट आपको जवाब देगा कि हस्ताक्षरित और हस्ताक्षरित पूर्णांक गुणा करते समय क्या होता है। http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe। संक्षिप्त उत्तर यह है कि, जब तक वे एक ही रैंक (आकार) होते हैं, तब तक हस्ताक्षरित हस्ताक्षर किए जाने के लिए एक हस्ताक्षरित टाइपकास्ट होता है। –

+0

किसी टिप्पणी के बजाय उत्तर पोस्ट करें ताकि मैं इसे स्वीकार कर सकूं ;-) – phkahler

+0

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

उत्तर

5

This post हस्ताक्षरित और हस्ताक्षरित पूर्णांक गुणा करते समय क्या होता है इसके बारे में बात करता है। संक्षिप्त उत्तर यह है कि, जब तक वे एक ही रैंक (आकार) होते हैं, तब तक हस्ताक्षरित हस्ताक्षर किए जाने के लिए एक हस्ताक्षरित टाइपकास्ट होता है।

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

+0

मेरे मामले में मिश्रण प्रकारों के परिणामस्वरूप नियमों के अनुसार गलत परिणाम होंगे। और यही वह है जो मुझे डर था। – phkahler

+1

क्या आप अपनी पोस्ट को उन सटीक मानों के साथ संपादित कर सकते हैं जिन्हें आप ए और बी में डाल रहे हैं जो नियमों के खिलाफ आने वाले परिणामों के साथ आते हैं? –

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