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

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • Businesses are moving more and more of their customer transactions to the web. Security is understandably a top concern as online transactions increase, so it is important to make sure your electronic signature provider meets the highest security standards. That means more than simply passing a security audit or obtaining a certification. This white paper provides recommendations for taking a broader view of e-signature security, and answers key questions that help identify the security requirements against …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds