Fixed Point Math

Limiting an Application to a Sin

A few years ago, I needed to use some data with decimal points on a DSP processor. The math library that came with the compiler was just too large and cumbersome. So, I wrote a fixed point library. This library is useful anywhere basic math needs to be done FAST. Microcontrollers don't use the floating point emulation, and PCs don't use the math coprocessor. With some tweaking, I have used it for basic animation and audio processing.

The fixed point library is very KISS. There is a class called "fixed" that essentially creates a new variable type similar to float or double.

#include <Fixed.h>
#include <math.h>
...
   fixed a, b, c, d;
   float f;

   // Assign the vars
   a = 2.56890830294f;
   b = 10.374237497987f;
   // Multiply them
   c = a*b;
   f = a*b;

   // Display the results
  printf("%.6f * %.6f = %.6f = %.6f\n", (float)a,(float)b,
         (float)c, f);

Also implemented in the library are all the arithmetic operators ( *, /, +, - ), and the trigonometric functions sin(), cos(), tan(), log(), log10(), pow(), sqrt(), and so forth.

// Assign the vars
a = 2.56890830294f;
b = 10.374237497987f;

// compute them
c = a.cos();
d = cosx(b);

// Display the results
printf("  cos(%.6f) = %.6f\n cosx(%.6f) = %.6f\n", (float)a,
       (float)c, (float)b, (float)d);

A lot of microcontrollers have limits to the integer sizes and other restrictions. There are a couple of #defines in the fixed.h header that account for some of these.

// Allow floating point input
#define FIXED_HAS_DOUBLE
// Allow longs
#define FIXED_HAS_LONG

FIXED_HAS_DOUBLE defines whether the processor supports the "double" size. Comment it out if a "double" == "float".

FIXED_HAS_LONG defines whether the processor differentiates between "long" and "int". Comment it out if a "long" == "int".

Internally, the class uses "long long". This is just used to ramp up precision. If the processor or compiler do not support "long long", it will just reduce precision.precision.

Where you use this library class takes some thought. There is overhead in converting between "fixed" and "float", so converting to "fixed" for one operation is not recommended for speed. Also, the trigonometric functions are NOT optimized, so if you have a math coprocessor, it may be faster to use it for the trigonometric functions.

This library is for doing basic fixed point math using integers. It is also a great learning tool to learn how math libraries work.



About the Author

Erik Gawtry

I have worked as a Software Engineer since 1985. I currently work with Windows, Unix/Linux, DSP, and Microcontrollers.

Downloads

Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Cisco and Intel have harnessed flash memory technology and truly innovative system software to blast through the boundaries of today's I/O-bound server/storage architectures. See how they are bringing real-time responsiveness to data-intensive applications—for unmatched business advantage. Sponsored by Cisco and Intel® Partnering in Innovation

  • Hybrid cloud platforms need to think in terms of sweet spots when it comes to application platform interface (API) integration. Cloud Velocity has taken a unique approach to tight integration with the API sweet spot; enough to support the agility of physical and virtual apps, including multi-tier environments and databases, while reducing capital and operating costs. Read this case study to learn how a global-level Fortune 1000 company was able to deploy an entire 6+ TB Oracle eCommerce stack in Amazon Web …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds