Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

# fixedpt.c

Go to the documentation of this file.

    00001 /*! \file fixedpt.c \brief Fixed-point math function library. */
    00002 //*****************************************************************************
    00003 //
    00004 // File Name    : 'fixedpt.c'
    00005 // Title        : Fixed-point math function library
    00006 // Author       : Pascal Stang - Copyright (C) 2003
    00007 // Created      : 2003.01.26
    00008 // Revised      : 2003.02.02
    00009 // Version      : 0.1
    00010 // Target MCU   : Atmel AVR Series
    00011 // Editor Tabs  : 4
    00012 //
    00013 // NOTE: This code is currently below version 1.0, and therefore is considered
    00014 // to be lacking in some functionality or documentation, or may not be fully
    00015 // tested.  Nonetheless, you can expect most functions to work.
    00016 //
    00017 // This code is distributed under the GNU Public License
    00018 //      which can be found at http://www.gnu.org/licenses/gpl.txt
    00019 //
    00020 //*****************************************************************************
    00021
    00022
    00023 #include "fixedpt.h"
    00024
    00025 // Program ROM constants
    00026
    00027 // Global variables
    00028 u08 FixedPtBits;
    00029
    00030 // Functions
    00031
    00032 // fixedptInit() initializes fixed-point math function library
    00033 void fixedptInit(u08 fixedPtBits)
    00034 {
    00035     // set the number of bits to use behind the point
    00036     FixedPtBits = fixedPtBits;
    00037 }
    00038
    00039 s32 fixedptConvertFromInt(s32 int_number)
    00040 {
    00041     // convert integer to fixed-point number
    00042     return (int_number<<FixedPtBits);
    00043 }
    00044
    00045 s32 fixedptConvertToInt(s32 fp_number)
    00046 {
    00047     // convert fixed-point number to integer
    00048     // do rounding
    00049     if( fp_number & 1<<(FixedPtBits-1) )
    00050     {
    00051         // bit behind the point was a '1'
    00052         // round up to next higher integer
    00053         return (fp_number>>FixedPtBits)+1;
    00054     }
    00055     else
    00056     {
    00057         // bit behind the point was a '0'
    00058         // round down (truncate) to next lower integer
    00059         return (fp_number>>FixedPtBits);
    00060     }
    00061 }
    00062
    00063 s32 fixedptAdd(s32 a, s32 b)
    00064 {
    00065     // add a and b (a+b) with fixed-point math
    00066     return a+b;
    00067 }
    00068
    00069 s32 fixedptSubtract(s32 a, s32 b)
    00070 {
    00071     // subtract a and b (a-b) with fixed-point math
    00072     return a-b;
    00073 }
    00074
    00075 s32 fixedptMultiply(s32 a, s32 b)
    00076 {
    00077     // multiply a and b (a*b) with fixed-point math
    00078     return (a*b)>>FixedPtBits;
    00079 }
    00080
    00081 s32 fixedptDivide(s32 numer, s32 denom)
    00082 {
    00083     // divide numer by denom (numer/denom) with fixed-point math
    00084     return (numer<<FixedPtBits)/denom;
    00085 }