A portable fixed point arithmetic library.
Some knowledge of how fixed point types are formatted is required to used this library to full effect. No knowledge of how these operations are implemented is required to use them.
This library was written with Arduino in mind, as well as CPUs with limited floating point support. However, given the templated nature of the library, it should still function on a wide variety of CPUs.
Here's a list of projects that use FixedPoints
:
If you have a project that uses FixedPoints
and would like your work to be showcased here,
please raise an issue.
This code uses the Apache 2.0 Licence. This means:
These are symbols you can define prior to library inclusion to alter the behaviour of the library.
FIXED_POINTS_USE_NAMESPACE
: Define this to wrap all classes and functions in the namespace FixedPoints
. Useful for preventing naming conflicts.FIXED_POINTS_NO_RANDOM
: Define this to disable the random utility functions. Useful for systems that don't have access to long random(void)
from avr-libc.UQ32x32
or SQ31x32
by another type?
This library supplies two core types and sixteen type aliases.
FIXED_POINTS_NAMESPACE
: The namespace used by FixedPoints. This is empty unless FIXED_POINTS_USE_NAMESPACE
is defined prior to inclusion.FIXED_POINTS_DETAILS
: An infrastructure macro that should not be used in user code. It is safe to undefine this if it is causing problems.FIXED_POINTS_BEGIN_NAMESPACE
: An infrastructure macro that should not be used in user code. It is safe to undefine this if it is causing problems.FIXED_POINTS_END_NAMESPACE
: An infrastructure macro that should not be used in user code. It is safe to undefine this if it is causing problems.The core types are provided by FixedPoints.h
.
UFixed<I, F>
: An unsigned fixed point type where I is the number of bits used for the integer part of the number and F is the number of bits used for the fractional part of the number. SFixed<I, F>
: An signed fixed point type where I is the number of bits used for the integer part of the number (excluding the implicit sign bit) and F is the number of bits used for the fractional part of the number.The common aliases are provided by FixedPointsCommon.h
.
UQ4x4
: An alias for UFixed<4, 4>
, an 8-bit unsigned fixed point in the Q4.4 format.UQ8x8
: An alias for UFixed<8, 8>
, a 16-bit unsigned fixed point in the Q8.8 format.UQ16x16
: An alias for UFixed<16, 16>
, a 32-bit unsigned fixed point in the Q16.16 format.UQ32x32
: An alias for UFixed<32, 32>
, a 64-bit unsigned fixed point in the Q32.32 format.UQ1x7
: An alias for UFixed<1, 7>
, an 8-bit unsigned fixed point in the Q1.7 format.UQ1x15
: An alias for UFixed<1, 15>
, a 16-bit unsigned fixed point in the Q1.15 format.UQ1x31
: An alias for UFixed<1, 31>
, a 32-bit unsigned fixed point in the Q1.31 format.UQ1x63
: An alias for UFixed<1, 63>
, a 64-bit unsigned fixed point in the Q1.63 format.SQ3x4
: An alias for SFixed<3, 4>
, an 8-bit signed fixed point in the Q3.4 format with implicit sign bit.SQ7x8
: An alias for SFixed<7, 8>
, a 16-bit signed fixed point in the Q7.8 format with implicit sign bit.SQ15x16
: An alias for SFixed<15, 16>
, a 32-bit signed fixed point in the Q15.16 format with implicit sign bit.SQ31x32
: An alias for SFixed<31, 32>
, a 64-bit signed fixed point in the Q31.32 format with implicit sign bit.SQ1x6
: An alias for SFixed<1, 6>
, an 8-bit signed fixed point in the Q1.6 format with implicit sign bit.SQ1x14
: An alias for SFixed<1, 14>
, a 16-bit signed fixed point in the Q1.14 format with implicit sign bit.SQ1x30
: An alias for SFixed<1, 30>
, a 32-bit signed fixed point in the Q1.30 format with implicit sign bit.SQ1x62
: An alias for SFixed<1, 62>
, a 64-bit signed fixed point in the Q1.62 format with implicit sign bit.+
: Adds two UFixed
s or two SFixed
s-
: Subtracts two UFixed
s or two SFixed
s*
: Multiplies two UFixed
s or two SFixed
s/
: Divides two UFixed
s or two SFixed
s==
: Compares two UFixed
s or two SFixed
s!=
: Compares two UFixed
s or two SFixed
s<
: Compares two UFixed
s or two SFixed
s<=
: Compares two UFixed
s or two SFixed
s>
: Compares two UFixed
s or two SFixed
s>=
: Compares two UFixed
s or two SFixed
sfloorFixed
: The floor operation.ceilFixed
: The Ceiling operationroundFixed
: Rounding operation.truncFixed
: Truncation operation.signbitFixed
: Returns true
for signed numbers and false
for unsigned numbers.copysignFixed
: Returns a value with the magnitude of the first argument and the sign of the second argument.multiply
: Multiplies two UFixed
s or two SFixed
s, returns a result that is twice the resolution of the input.UFixed<I, F>::getInteger
: Gets the integer part of an unsigned fixed point.
UFixed<I, F>::getFraction
: Gets the fractional part of an unsigned fixed point.
UFixed<I, F>::getInternal
: Gets the internal representation of an unsigned fixed point.
SFixed<I, F>::getInteger
: Gets the integer part of a signed fixed point.
SFixed<I, F>::getFraction
: Gets the fractional part of a signed fixed point.
SFixed<I, F>::getInternal
: Gets the internal representation of a signed fixed point.
UFixed<I, F>::fromInternal
: Produces an unsigned fixed point number from its internal representation.SFixed<I, F>::fromInternal
: Produces a signed fixed point number from its internal representation.Note that both UFixed<I, F>
and SFixed<I, F>
are implicitly compile-time constructable from all integer and decimal literals.
This means that you may write code such as UFixed<8, 8> value = 0.5;
without incurring a runtime cost for converting from double
to UFixed<8, 8>
because the constructor is constexpr
.
UFixed<I, F>
is constructable from:
I
bits.
-- The fractional part is of the smallest type capable of representing F
bits.
-- If constant values are used, the fixed point shall be constructed at compile time.SFixed<I, F>
is constructable from:
I + 1
bits.
-- The fractional part is of the smallest type capable of representing F
bits.
-- If constant values are used, the fixed point shall be constructed at compile time.UFixed<I, F>
is explicitly convertible to:
float
.double
.I
bits.UFixed
type of a different scale. E.g. UFixed<4, 4>
may be converted to UFixed<8, 8>
and vice versa.SFixed<I, F>
is explicitly convertible to:
float
.double
.I + 1
bits.SFixed
type of a different scale. E.g. SFixed<3, 4>
may be converted to SFixed<7, 8>
and vice versa.