+ Post New Thread
Results 1 to 9 of 9
  1. #1
    Member level 2
    Points: 306, Level: 3

    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?

  2. #2
    Advanced Member level 3
    Points: 6,174, Level: 18

    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 look-up-table.



    •   AltAdvertisement

        
       

  3. #3
    Advanced Member level 1
    Points: 5,642, Level: 17

    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);



    •   AltAdvertisement

        
       

  4. #4
    Member level 2
    Points: 306, Level: 3

    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



    •   AltAdvertisement

        
       

  5. #5
    Advanced Member level 1
    Points: 5,642, Level: 17

    Join Date
    May 2005
    Posts
    460
    Helped
    105 / 105
    Points
    5,642
    Level
    17

    Re: fixed point arithmetic in c

    Quote Originally Posted by curious_mind View Post
    how to take care of oveflow for addition and subtraction? c should be short or long?
    You'd need to use long - or an MCU that supports saturating fixed-point types.



  6. #6
    Member level 2
    Points: 306, Level: 3

    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?



  7. #7
    Super Moderator
    Points: 261,317, Level: 100
    Awards:
    1st Helpful Member

    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.



  8. #8
    Member level 2
    Points: 306, Level: 3

    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=a-b;
    res=tmp & 0xffff;
    }
    
    return(res);
    }
    Last edited by betwixt; 27th October 2019 at 10:24. Reason: added code tags



    •   AltAdvertisement

        
       

  9. #9
    Super Moderator
    Points: 261,317, Level: 100
    Awards:
    1st Helpful Member

    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.



--[[ ]]--