This library provides the define_q_num!
procedural macro (evaluated at compile
time) to define a signed/unsigned binary fixed-point number type. It uses
ARM-style Q notation: Qm.n
(signed) or UQm.n
(unsigned), where:
m
is the number of integer bits, andn
is the number of fractional bits.Internally, the macro chooses the narrowest primitive integer type that can hold
m + n
bits, up to u64
(unsigned) and i64
(signed). More internal details
are discussed below.
A Q number's value is the ratio of the stored number (having n + m
bits)
and a fixed denominator (equal to 2 ^ n
).
For example, using the UQ3.2 specification, the bit pattern 0b10111
represents the value 5.75. Keeping in mind the denominator is 2 ^ 2 = 4,
there are two ways to see this:
Here is one example:
rs
define_q_num!(MyQ, Q6.2);
let a = MyQ::from(13.75);
let b = MyQ::from(-2.25);
let c = a + b // 11.5