#[repr(transparent)]pub struct Q<T, A, const F: i8> {
pub inner: T,
/* private fields */
}Expand description
Fixed point integer
Generics:
T: Base integerA: Accumulator for intermediate resultsF: Number of fractional bits right of the decimal point
F negative is supported analogously.
Q32<31>is(-1..1).step_by(2^-31)Q<i16, _, 20>is(-1/32..1/32).step_by(2^-20)Q<u8, _, 4>is(0..16).step_by(1/16)Q<u8, _, -2>is(0..1024).step_by(4)
assert_eq!(Q8::<4>::from_int(3), Q8::new(3 << 4));
assert_eq!(7 * Q8::<4>::from_f32(1.5), 10);
assert_eq!(7 / Q8::<4>::from_f32(1.5), 4);Fields§
§inner: TThe inner value representation
Implementations§
Source§impl<T: Shift, A, const F: i8> Q<T, A, F>
impl<T: Shift, A, const F: i8> Q<T, A, F>
Trait Implementations§
Source§impl<T: AddAssign<T>, A, const F: i8> AddAssign for Q<T, A, F>
impl<T: AddAssign<T>, A, const F: i8> AddAssign for Q<T, A, F>
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
Performs the
+= operation. Read moreSource§impl<T: 'static + Copy, A: 'static, const F: i8> AsPrimitive<Q<T, A, F>> for f32where
f32: AsPrimitive<T>,
impl<T: 'static + Copy, A: 'static, const F: i8> AsPrimitive<Q<T, A, F>> for f32where
f32: AsPrimitive<T>,
Source§impl<T: 'static + Copy, A: 'static, const F: i8> AsPrimitive<Q<T, A, F>> for f64where
f64: AsPrimitive<T>,
impl<T: 'static + Copy, A: 'static, const F: i8> AsPrimitive<Q<T, A, F>> for f64where
f64: AsPrimitive<T>,
Source§impl<T: AsPrimitive<f32>, A: 'static, const F: i8> AsPrimitive<f32> for Q<T, A, F>
impl<T: AsPrimitive<f32>, A: 'static, const F: i8> AsPrimitive<f32> for Q<T, A, F>
Source§impl<T: AsPrimitive<f64>, A: 'static, const F: i8> AsPrimitive<f64> for Q<T, A, F>
impl<T: AsPrimitive<f64>, A: 'static, const F: i8> AsPrimitive<f64> for Q<T, A, F>
Source§impl<T: BitAndAssign<T>, A, const F: i8> BitAndAssign for Q<T, A, F>
impl<T: BitAndAssign<T>, A, const F: i8> BitAndAssign for Q<T, A, F>
Source§fn bitand_assign(&mut self, rhs: Self)
fn bitand_assign(&mut self, rhs: Self)
Performs the
&= operation. Read moreSource§impl<T: BitOrAssign<T>, A, const F: i8> BitOrAssign for Q<T, A, F>
impl<T: BitOrAssign<T>, A, const F: i8> BitOrAssign for Q<T, A, F>
Source§fn bitor_assign(&mut self, rhs: Self)
fn bitor_assign(&mut self, rhs: Self)
Performs the
|= operation. Read moreSource§impl<T: BitXorAssign<T>, A, const F: i8> BitXorAssign for Q<T, A, F>
impl<T: BitXorAssign<T>, A, const F: i8> BitXorAssign for Q<T, A, F>
Source§fn bitxor_assign(&mut self, rhs: Self)
fn bitxor_assign(&mut self, rhs: Self)
Performs the
^= operation. Read moreSource§impl<'de, T, A, const F: i8> Deserialize<'de> for Q<T, A, F>where
T: Deserialize<'de>,
impl<'de, T, A, const F: i8> Deserialize<'de> for Q<T, A, F>where
T: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl<T, A, const F: i8> Div for Q<T, A, F>where
Self: DivAssign,
Q/Q -> Q
impl<T, A, const F: i8> Div for Q<T, A, F>where
Self: DivAssign,
Q/Q -> Q
assert_eq!(Q8::<4>::from_int(3) / Q8::from_int(2), Q8::from_f32(1.5));Source§impl<T: Copy + Shift + Accu<A> + Div<T, Output = T>, A: Shift + Div<A, Output = A>, const F: i8, const F1: i8> DivAssign<Q<T, A, F1>> for Q<T, A, F>
Q /= Q’
impl<T: Copy + Shift + Accu<A> + Div<T, Output = T>, A: Shift + Div<A, Output = A>, const F: i8, const F1: i8> DivAssign<Q<T, A, F1>> for Q<T, A, F>
Q /= Q’
let mut q = Q8::<4>::from_f32(0.75);
q /= Q8::<3>::from_int(3);
assert_eq!(q, Q8::from_f32(0.25));Source§fn div_assign(&mut self, rhs: Q<T, A, F1>)
fn div_assign(&mut self, rhs: Q<T, A, F1>)
Performs the
/= operation. Read moreSource§impl<T: DivAssign<T>, A, const F: i8> DivAssign<T> for Q<T, A, F>
impl<T: DivAssign<T>, A, const F: i8> DivAssign<T> for Q<T, A, F>
Source§fn div_assign(&mut self, rhs: T)
fn div_assign(&mut self, rhs: T)
Performs the
/= operation. Read moreSource§impl<T: Accu<A> + Shift, A, const F: i8> From<(T, i8)> for Q<T, A, F>
Lossy conversion from a dynamically scaled integer
impl<T: Accu<A> + Shift, A, const F: i8> From<(T, i8)> for Q<T, A, F>
Lossy conversion from a dynamically scaled integer
assert_eq!(Q8::<8>::from((1, 3)).inner, 1 << 5);Source§impl<T, A, const F: i8> From<Q<T, A, F>> for (T, i8)
Lossless conversion into a dynamically scaled integer
impl<T, A, const F: i8> From<Q<T, A, F>> for (T, i8)
Lossless conversion into a dynamically scaled integer
let q: (i8, i8) = Q8::<8>::new(9).into();
assert_eq!(q, (9, 8));Source§impl<T: Accu<A>, A: Mul<Output = A>, const F: i8> Mul<T> for Q<T, A, F>
Wide multiplication to accumulator
impl<T: Accu<A>, A: Mul<Output = A>, const F: i8> Mul<T> for Q<T, A, F>
Wide multiplication to accumulator
assert_eq!(Q8::<3>::new(4) * 2, Q::new(8));
assert_eq!(Q8::<3>::new(4) / 2, Q8::new(2));Source§impl<T, A, const F: i8> Mul for Q<T, A, F>where
Self: MulAssign,
Q*Q -> Q
impl<T, A, const F: i8> Mul for Q<T, A, F>where
Self: MulAssign,
Q*Q -> Q
assert_eq!(
Q8::<4>::from_f32(0.75) * Q8::from_int(3),
Q8::from_f32(2.25)
);Source§impl<T: Copy + Accu<A>, A: Shift + Mul<A, Output = A>, const F: i8, const F1: i8> MulAssign<Q<T, A, F1>> for Q<T, A, F>
Q *= Q’
impl<T: Copy + Accu<A>, A: Shift + Mul<A, Output = A>, const F: i8, const F1: i8> MulAssign<Q<T, A, F1>> for Q<T, A, F>
Q *= Q’
let mut q = Q8::<4>::from_f32(0.25);
q *= Q8::<3>::from_int(3);
assert_eq!(q, Q8::from_f32(0.75));Source§fn mul_assign(&mut self, rhs: Q<T, A, F1>)
fn mul_assign(&mut self, rhs: Q<T, A, F1>)
Performs the
*= operation. Read moreSource§impl<T: MulAssign<T>, A, const F: i8> MulAssign<T> for Q<T, A, F>
impl<T: MulAssign<T>, A, const F: i8> MulAssign<T> for Q<T, A, F>
Source§fn mul_assign(&mut self, rhs: T)
fn mul_assign(&mut self, rhs: T)
Performs the
*= operation. Read moreSource§impl<T: Ord, A, const F: i8> Ord for Q<T, A, F>where
Self: PartialOrd,
impl<T: Ord, A, const F: i8> Ord for Q<T, A, F>where
Self: PartialOrd,
Source§impl<T: PartialOrd, A, const F: i8> PartialOrd for Q<T, A, F>
impl<T: PartialOrd, A, const F: i8> PartialOrd for Q<T, A, F>
Source§impl<T: RemAssign<T>, A, const F: i8> RemAssign for Q<T, A, F>
impl<T: RemAssign<T>, A, const F: i8> RemAssign for Q<T, A, F>
Source§fn rem_assign(&mut self, rhs: Self)
fn rem_assign(&mut self, rhs: Self)
Performs the
%= operation. Read moreSource§impl<T: ShlAssign<U>, U, A, const F: i8> ShlAssign<U> for Q<T, A, F>
impl<T: ShlAssign<U>, U, A, const F: i8> ShlAssign<U> for Q<T, A, F>
Source§fn shl_assign(&mut self, rhs: U)
fn shl_assign(&mut self, rhs: U)
Performs the
<<= operation. Read moreSource§impl<T: ShrAssign<U>, U, A, const F: i8> ShrAssign<U> for Q<T, A, F>
impl<T: ShrAssign<U>, U, A, const F: i8> ShrAssign<U> for Q<T, A, F>
Source§fn shr_assign(&mut self, rhs: U)
fn shr_assign(&mut self, rhs: U)
Performs the
>>= operation. Read moreSource§impl<T: SubAssign<T>, A, const F: i8> SubAssign for Q<T, A, F>
impl<T: SubAssign<T>, A, const F: i8> SubAssign for Q<T, A, F>
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
Performs the
-= operation. Read moreimpl<T: Copy, A, const F: i8> Copy for Q<T, A, F>
impl<T: Eq, A, const F: i8> Eq for Q<T, A, F>where
Self: PartialEq,
Auto Trait Implementations§
impl<T, A, const F: i8> Freeze for Q<T, A, F>where
T: Freeze,
impl<T, A, const F: i8> RefUnwindSafe for Q<T, A, F>where
T: RefUnwindSafe,
A: RefUnwindSafe,
impl<T, A, const F: i8> Send for Q<T, A, F>
impl<T, A, const F: i8> Sync for Q<T, A, F>
impl<T, A, const F: i8> Unpin for Q<T, A, F>
impl<T, A, const F: i8> UnwindSafe for Q<T, A, F>where
T: UnwindSafe,
A: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more