Update! (19 July 06) Added Multiply. Fixed a problem with using __builtin_clz().
Update! (17 July 06) The code has been
considerably refactored. Decided to go with single function per
expression. The expressions have been reduced as a first optimization
pass.
Project
The goal of this project is serve as an example of developing some
relatively complex operations completely without branches - a software
implementation of half-precision floating point numbers (That does not
use floating point hardware). This example should echo the IEEE 754
standard for floating point numbers as closely as reasonable, including
support for +/- INF, QNan, SNan, and denormalized numbers. However,
exceptions will not be implemented.Half-precision floats are used in cases where neither the range nor the precision of 32 bit floating point numbers are needed, but where some dynamic precision is required. Two common uses are for image transformation, where the range of each component (e.g. red, green, blue, alpha) is typically limited to or near [0.0,1.0] or vertex data (e.g. position, texture coordinates, color values, etc.).
The main advantage of half-precision floats is their size. Beyond the considerable potential for memory savings, processing a large number of half-precision values is more cache-friendly than using 32 bit values.
The current released version (including tests) can be downloaded here: half.c half.h