Fixed-point multiplication (C166 A*B/B)

Posted xihong2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fixed-point multiplication (C166 A*B/B)相关的知识,希望对你有一定的参考价值。

I want to multiply two fixed point numbers. After the multiplication I have to shift the result so that the binary point is correct.
Example:
int a;
int b;
int c;
c = (a * b) >> 10

The multiplication a*b produces a long int value in the MD register. After the shift operation the int result (the lower byte) should be stored in c.
My problem is how to use then 32-bit MD register. When I look at the assembler code only the lower byte of the MD register is used for the shift operation, but I first I want to shift the whole register and then take only the lower byte.
How can I implement that in C? Who knows an application note about fixed-point arithmetic with the C166?
 
Read-Only
Author
Andrew Neil
Posted
22-Oct-2003 09:34 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
I don‘t know the ‘166, but I suspect this is a ‘C‘ issue rather than a processor issue.

You could look up the promotion rules in K&R, or you could just try experimenting with casting a, b, and/or the product to long.
 
Read-Only
Author
Mike Kleshov
Posted
22-Oct-2003 09:56 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
As Andrew said, this is a C issue. Take your favourite book on C and read about types and expressions. There are a few pitfalls there.
If both operands a and b are of type int, then the product (a * b) will be of type int, which is not what you are expecting. If you want the result to be of type long, try ((long)a * b): it will suffice to cast one of the operands to long.
Make sure you take care of overflows and that you understand the differences between signed and unsigned arithmetics.

- mike
 
Read-Only
Author
Bruno Büsser
Posted
22-Oct-2003 10:45 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
That‘s it!
The following line produces just what I wanted:
c = ((long)a * b)>>10;

The product a*b is stored as 32 bit value in MD register, then the MD register value is arithmetic shifted right by 10 and the lower 16 bits stored in c.
Thanks to Andrew and Mike!

http://www.keil.com/forum/3549/

 


























以上是关于Fixed-point multiplication (C166 A*B/B)的主要内容,如果未能解决你的问题,请参考以下文章

定点数(fixed-point number)

1定点数与浮点数

SICP 习题 (1.35)解题总结

使用FDATOOL生成xilinx中FIR滤波器IP核的系数