This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Mixed-type division in DSP lib

Note: This was originally posted on 30th November 2012 at http://forums.arm.com

Some of the ARM CMSIS routines employ mixed-type division without explicit casting.  See below.  The last line is a q31_t/uint32_t operation.  I could not find an explicit behavior for this situation in a recent C standard, but I believe both operands would be converted to unsigned using the K&R rules.  My compiler is indeed providing the UDIV instruction which gives erroneous results if sum is negative.  

Is this a code issue or compiler implementation issue?

***********************


void arm_mean_q15(
  q15_t * pSrc,
  uint32_t blockSize,
  q15_t * pResult)
{
  q31_t sum = 0;                              /* Temporary result storage */
  ...

  *pResult = (q15_t) (sum / blockSize);
}

Regards,
Bryan
Parents
  • Note: This was originally posted on 3rd December 2012 at http://forums.arm.com

    Hi Bryan,

    I was wondering the exact same thing as I got wrong results in my application... I ran the same kind of division with gcc and I also got a wrong result. Once I added the cast to blockSize it worked correctly.


    Would this be related to "6.3.1.8 Usual arithmetic conversions" (C99) :

    "[...] Otherwise, if the operand that has unsigned integer type has rank greater or
    equal to the rank of the type of the other operand, then the operand with
    signed integer type is converted to the type of the operand with unsigned
    integer type."

    Anyone knows if I'm doing it wrong or if the CMSIS routines need this cast?

    Best regards,

    --
    Emilien
Reply
  • Note: This was originally posted on 3rd December 2012 at http://forums.arm.com

    Hi Bryan,

    I was wondering the exact same thing as I got wrong results in my application... I ran the same kind of division with gcc and I also got a wrong result. Once I added the cast to blockSize it worked correctly.


    Would this be related to "6.3.1.8 Usual arithmetic conversions" (C99) :

    "[...] Otherwise, if the operand that has unsigned integer type has rank greater or
    equal to the rank of the type of the other operand, then the operand with
    signed integer type is converted to the type of the operand with unsigned
    integer type."

    Anyone knows if I'm doing it wrong or if the CMSIS routines need this cast?

    Best regards,

    --
    Emilien
Children
No data