2017-02-21 8 views
9

मेरे पास निश्चित बिंदु 19.13 प्रारूप में दो 32 बिट संख्याओं को गुणा करने के लिए निम्न विधि है। लेकिन मुझे लगता है कि इस विधि के साथ एक समस्या है:नकारात्मक संख्याओं का फिक्स्ड पॉइंट गुणा

1.5f, 2.0f तक बढ़ाना है, जबकि -1.5f-1.0f तक बढ़ाना है।

ऐसा लगता है कि -1.5-2.0f पर गोल किया जाना चाहिए।

सबसे पहले, वर्तमान राउंडिंग समझ में आता है, और यदि नहीं, तो मैं इसे को और अधिक सुसंगत बनाने के लिए कैसे बदल सकता हूं?

static OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) { 
    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ; 
    temp += 4096; 
    assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF); 
    assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1)); 
    return (OPJ_INT32) (temp >> 13); 
} 

उत्तर

5

जब से तुम हमेशा 4096 जोड़ रहे हैं, कोड सकारात्मक अनंत की ओर राउंडिंग आधे रास्ते मामलों कर रही है। यह अजीब तरह का है।

सकारात्मक अनंत की ओर दौर के लिए, मैं

temp += 4096 + 4095; 

में हमेशा की तरह फैशन (निकटतम करने के लिए) दौर के लिए, बजाय का उपयोग करने के लिए दौर 0.

temp += (temp < 0) ? -4096 : 4096; 

से दूर एक पूर्वाग्रह जोड़ने उम्मीद थी निकटतम और संबंध तक और भी काम है। निश्चित नहीं है कि ओपी चाहता है कि।

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