+ Post New Thread
Results 1 to 9 of 9

24th October 2019, 13:37 #1
 Join Date
 Apr 2019
 Posts
 44
 Helped
 0 / 0
 Points
 306
 Level
 3
fixed point arithmetic in c
I am looking for a C code to perform Q15 addition, subtraction, multiplication, division , sine(x) and cosine(x). Can anybody provide good reference that works?

24th October 2019, 15:03 #2
 Join Date
 Feb 2014
 Posts
 888
 Helped
 292 / 292
 Points
 6,174
 Level
 18
Re: fixed point arithmetic in c
I'd start with searching "fixed point [add/subtract/mult]" etc. There are different options for each. Saying its fixed point also doesn't tell us if you have hardware multiply/divide support though I'll assume no.
Understand that a lot of it comes down to designing your algorithms around the limitations. For example if you don't have hardware multiply then plan around doing power of 2 shift divides with << and >>. Sin and cos are typically implemented with a lookuptable.

Advertisement

25th October 2019, 01:10 #3
 Join Date
 May 2005
 Posts
 460
 Helped
 105 / 105
 Points
 5,642
 Level
 17
Re: fixed point arithmetic in c
short a, b, c;
Addition: c = a + b;
Subtraction: c = a  b;
Multiplication: c = (short)((a * (long)b) >> 15);

Advertisement

25th October 2019, 10:14 #4
 Join Date
 Apr 2019
 Posts
 44
 Helped
 0 / 0
 Points
 306
 Level
 3
Re: fixed point arithmetic in c
how to take care of oveflow for addition and subtraction? c should be short or long?
Last edited by curious_mind; 25th October 2019 at 10:24. Reason: additional info

Advertisement

25th October 2019, 10:43 #5
 Join Date
 May 2005
 Posts
 460
 Helped
 105 / 105
 Points
 5,642
 Level
 17

27th October 2019, 06:19 #6
 Join Date
 Apr 2019
 Posts
 44
 Helped
 0 / 0
 Points
 306
 Level
 3
Re: fixed point arithmetic in c
Hi
I am considering 2's complement unsigned data that varies from 0 to 65535. What would happen if I would add 10 with 32767. The result is a negative number. How would I guard this?

27th October 2019, 09:16 #7
 Join Date
 Jan 2008
 Location
 Bochum, Germany
 Posts
 45,654
 Helped
 13881 / 13881
 Points
 261,317
 Level
 100
Re: fixed point arithmetic in c
Your specification is rather shallow. You say "take care of overflow". How? Saturate? Generate an exception?
In case, additional code is required. The CPU may be already able to detect a signed integer overflow. Or you detect it by monitoring the arguments and result signs.

27th October 2019, 09:22 #8
 Join Date
 Apr 2019
 Posts
 44
 Helped
 0 / 0
 Points
 306
 Level
 3
Re: fixed point arithmetic in c
I came up with the following custom c code. Your view on this will be helpful
Code:unsigned int add (unsigned int a ,unsigned int b) { unsigned int res; unsigned long tmp; tmp=a+b; if((a<=32767) && (b<=32767)) // both numbers are positive { if (tmp>32767) { res=32767; } } else if((a>32767) && (b>32767)) // both numbers are negative { if (tmp>32768) { res=32768; } } else { res=tmp & 0xffff; } return(res); } unsigned int sub (unsigned int a ,unsigned int b) { unsigned int res; unsigned long tmp; if((a<=32767) && ( b>=32768)  (a>=32768) && (b<=32767)) { if(a>b) { res=32768; } else { res=32767; } } else { tmp=ab; res=tmp & 0xffff; } return(res); }
Last edited by betwixt; 27th October 2019 at 10:24. Reason: added code tags

Advertisement

27th October 2019, 11:12 #9
 Join Date
 Jan 2008
 Location
 Bochum, Germany
 Posts
 45,654
 Helped
 13881 / 13881
 Points
 261,317
 Level
 100
Re: fixed point arithmetic in c
Looks O.K. as a demonstration but can be coded more efficiently using bit operations.
+ Post New Thread
Please login