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

  • Wednesday, September 24, 2014 8:00 AM - 9:00 AM PDT According to a recent Forrester Research report, many companies are choosing low-code platforms over traditional programming platforms, due to the speed with which low-code apps can be assembled and tested. With customer-facing applications on the rise, traditional programming platforms simply can't keep up with the "short schedules and rapid change cycles" required to develop these applications. Check out this upcoming webinar and join Clay Richardson from …

  • Best-in-Class organizations execute on a strategy that supports the multi-channel nature of customer requests. These leading organizations do not just open up their service infrastructures to accommodate new channels, but also empower their teams to deliver an effective and consistent experience regardless of the channel selected by the customer. This document will highlight the key business capabilities that support a Best-in-Class customer engagement strategy.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds