निश्चित बिंदु गणित में मैं बहुत से 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 में बदलें)। हालांकि, मैंने कभी नहीं समझा कि क्या होता है यदि आप सी में हस्ताक्षरित और हस्ताक्षरित संख्याओं को गुणा करने का प्रयास करते हैं और इससे बचा है। एएसएम में मुझे याद नहीं है कि एक गुणा निर्देश है जो किसी भी आर्किटेक्चर पर मिश्रित प्रकारों के साथ काम करेगा, इसलिए यदि सी सही काम करता है तो भी मुझे यकीन नहीं है कि यह कुशल कोड उत्पन्न करेगा।
क्या मुझे निश्चित बिंदु कोड में हस्ताक्षरित प्रकारों पर हस्ताक्षर किए गए मिश्रण को मिश्रित करने का अपना अभ्यास जारी रखना चाहिए? या यह अच्छी तरह से काम कर सकते हैं?
यह पोस्ट आपको जवाब देगा कि हस्ताक्षरित और हस्ताक्षरित पूर्णांक गुणा करते समय क्या होता है। http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe। संक्षिप्त उत्तर यह है कि, जब तक वे एक ही रैंक (आकार) होते हैं, तब तक हस्ताक्षरित हस्ताक्षर किए जाने के लिए एक हस्ताक्षरित टाइपकास्ट होता है। –
किसी टिप्पणी के बजाय उत्तर पोस्ट करें ताकि मैं इसे स्वीकार कर सकूं ;-) – phkahler
उस समय किसी कारण से मैंने सोचा कि मैं केवल आपके प्रश्न का उत्तर दे रहा था, इसलिए मैंने इसे एक टिप्पणी के रूप में छोड़ दिया। अब जब मैं फिर से देखता हूं, मुझे यकीन नहीं है कि मैंने ऐसा क्यों सोचा। धन्यवाद! –