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
  • 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
  • Note: This was originally posted on 3rd December 2012 at http://forums.arm.com

    Hi Bryan and Emilien,
    Thanks for reporting this issue with the CMSIS library.  This is indeed a bug and the signed sum result is converted to unsigned.  We'll get this fixed in the next release of the CMSIS library.

    -Paul