Fixed Point Math
Title:Fixed Point Math
Author:ale_pacito
Published:Sat, 29 Dec 2007 12:29:16 GMT

Fixed Point Math


Fixed point Math makes reference to a way of number representation that allows fast calculations without all the burden of a full floating point implementation with some floating point advantages, i.e decimal places. This article will be focused in 16.16 Fixed point numbers (aka FP16.16).

This representation has important properties:

There is no exponent
The number is denormalized
The fraction does not represent decimal digits, is a binary fraction.

The number one (1.0) is represented as $1_0000
The number two (2.0) is represented as $2_0000
The number 1/2 (0.5) is represented as $0_8000

Arithmetic

Addition and subtraction of two FP16.16 yields directly a FP16.16

    add  n1,n2
n1  long $1_0000
n2  long $2_0000
 
yields n1 = $3_0000

Multiplication is a bit more complicated because the result gets scaled as a consequence of taking the number of bits of both arguments added.

    mull  n1,n2     ' inexistent 32x32 multiplication, returns high 32 bits discards lower 32 bits
n1  long  $2_0000
n2  long  §3_0000
 
yields $6_0000
 

Division is a bit much more complicated, because scaling also occurs and all non-zero digits to the right of the decimal point will be lost:


    divl  n1,n2     ' hypothetic 32 by 32 bit division
n1  long  $5_0000   ' 5.0
n2  long  $0_8000   ' 0.5
 
will yield $0_000A, an unscaled result (should be $A_0000, 10.0)
 
    divl  n1,n2     ' hypothetic 32 by 32 bit division
n1  long  $5_0000   ' 5.0
n2  long  $0_4000   ' 0.25
 
will yield $0_0014, an unscaled result (should be $14_0000, 20.0)
 
 


((More to come))