Libfixmath

{{Primary sources|date=January 2023}}

{{lowercase|title=libfixmath}}

{{Infobox software

| name = libfixmath

| developer = Ben Brewer

| latest_release_version = r64

| latest_release_date = {{Start date and age|2012|02|02}}

| programming language = C99

| operating_system = Cross-platform

| genre = fixed-point math library

| license = MIT

| website =

}}

libfixmath is a platform-independent fixed-point math library aimed at developers wanting to perform fast non-integer math on platforms lacking a (or with a low performance) FPU. It offers developers a similar interface to the standard math.h functions for use on Q16.16 fixed-point numbers. libfixmath has no external dependencies other than stdint.h and a compiler which supports 64-bit integer arithmetic (such as GCC).{{cite web|url=https://github.com/PetteriAimonen/libfixmath|title=libfixmath Project Page|website=GitHub }}

Conditional compilation options exist to remove the requirement for a 64-bit capable compiler as many compilers for microcontrollers and DSPs do not support 64-bit arithmetic.{{cite web|url=https://code.google.com/p/libfixmath/issues/detail?id=4|title=64-bit Compiler Support Issues}}

History

libfixmath was developed by Ben Brewer and first released publicly as part of the Dingoo SDK.{{cite web|url=https://code.google.com/p/dingoo-sdk|title=Dingoo SDK Project Page}} It has since been used to implement a software 3D graphics library called FGL.{{cite web|url=https://code.google.com/p/fgl|title=FGL Flatmush/Fixed-Point Graphics Library Project Page}}

Q16.16 functions

class="wikitable"
NameDescription
fix16_acosinverse cosine
fix16_asininverse sine
fix16_atanone-parameter inverse tangent
fix16_atan2two-parameter inverse tangent
fix16_coscosine
fix16_expexponential function
fix16_sinsine
fix16_sqrtsquare root
fix16_tantangent
fix16_mulmultiplication
fix16_divdivision
fix16_saddsaturated addition
fix16_smulsaturated multiplication
fix16_sdivsaturated division

Other functions

class="wikitable"
NameDescription
fix16_to_dblConvert Q16.16 to a double
fix16_to_floatConvert Q16.16 to a float
fix16_to_intConvert Q16.16 to an integer
fix16_from_dblConvert double to a Q16.16
fix16_from_floatConvert float to a Q16.16
fix16_from_intConvert integer to a Q16.16

Performance

For the most intensive function (atan2) benchmark results show the following results:

class="wikitable"
NameTime Compared to Float
ARM Cortex-M026.3%
Marvell PXA270 (ARM) @ 312 MHz58.45%
Intel T5500120%
Intel Atom N280141%

Note: These results were calculated using fixtest with caching optimizations turned off.{{cite web|url=https://code.google.com/p/libfixmath/downloads/detail?name=fixtest_r16.zip|title=fixtest Download Page}}

Licensing

libfixmath is released under the MIT License, a permissive free software licence, and is free software.

See also

References

{{Reflist}}