pub struct Fix<R, B, E>where
R: Radix<B>,{ /* private fields */ }Expand description
Fixed-point number representing _ Radix Digits × Radix Exponent_.
Radixis a type-level integer which represents the base of number.Digitsis a signed positive type-levelIntegerwhich represent width of mantissa in digits of specified radix.Exponentis a signed type-levelInteger.
§Summary of operations
Lower case variables represent values of mantissa. Upper case R, B and E represent type-level integers Radix, Digits and Exponent, respectively.
§Arithmetic
TODO: Update outdated docs
-
−(x BE) = (−x) BE
-
(xMx BEx) + (yMy BEy) = (x + y)max Mx My Bmin Ex Ey
-
(xMx BEx) - (yMy BEy) = (x - y)max Mx My Bmin Ex Ey
-
(xMx BEx) × (yMy BEy) = (x × y)Mx + My BEx + Ey
-
(xMx BEx) ÷ (yMy BEy) = (x ÷ y)Mx - My BEx − Ey
-
(x BEx) % (y BEy) = (x % y) BEx
§Comparison
To compare fixed-point values of different types you should first cast at least one of its to type of other or cast both to single common type. Implicit semi-automatic conversion lacks because in common case it may give ambiguous results.
Implementations§
Source§impl<R, B, E> Fix<R, B, E>
impl<R, B, E> Fix<R, B, E>
Sourcepub const fn new(bits: R::Type) -> Self
pub const fn new(bits: R::Type) -> Self
Create a number from raw value.
§Examples
use typenum::P2;
use ufix::si::{Kilo, Milli};
Milli::<P2>::new(25); // 0.025
Kilo::<P2>::new(25); // 25 000Sourcepub const fn into_inner(self) -> R::Type
pub const fn into_inner(self) -> R::Type
Get raw value of a number.
Sourcepub fn convert<Br, Er>(self) -> Fix<R, Br, Er>
pub fn convert<Br, Er>(self) -> Fix<R, Br, Er>
Converts to another Bits and/or Exp.
§Examples
use typenum::{P1, P7};
use ufix::si::{Kilo, Milli};
let kilo = Kilo::<P1>::new(5);
let milli = Milli::<P7>::new(5_000_000);
assert_eq!(kilo, milli.convert());
assert_eq!(milli, kilo.convert());Sourcepub fn try_convert<Br, Er>(self) -> Result<Fix<R, Br, Er>>
pub fn try_convert<Br, Er>(self) -> Result<Fix<R, Br, Er>>
Converts to another Bits and/or Exp.
§Examples
use typenum::{P1, P7};
use ufix::si::{Kilo, Milli};
let kilo = Kilo::<P1>::new(5);
let milli = Milli::<P7>::new(5_000_000);
assert_eq!(kilo, milli.convert());
assert_eq!(milli, kilo.convert());Trait Implementations§
Source§impl<R, B1, E1, B2, E2> Add<Fix<R, B2, E2>> for Fix<R, B1, E1>where
R: Radix<B1> + Radix<B2> + Radix<<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>,
B1: Digits + Add<E1>,
E1: Exponent + Min<E2>,
B2: Digits + Add<E2>,
E2: Exponent,
Sum<B1, E1>: Max<Sum<B2, E2>>,
Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>>: Add1,
<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output: Digits,
Minimum<E1, E2>: Exponent,
Maximum<Sum<B1, E1>, Sum<B2, E2>>: Sub<Minimum<E1, E2>>,
Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>: Cast<Mantissa<R, B1>> + Cast<Mantissa<R, B2>> + Add<Output = Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>>,
Fixed-point addition
impl<R, B1, E1, B2, E2> Add<Fix<R, B2, E2>> for Fix<R, B1, E1>where
R: Radix<B1> + Radix<B2> + Radix<<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>,
B1: Digits + Add<E1>,
E1: Exponent + Min<E2>,
B2: Digits + Add<E2>,
E2: Exponent,
Sum<B1, E1>: Max<Sum<B2, E2>>,
Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>>: Add1,
<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output: Digits,
Minimum<E1, E2>: Exponent,
Maximum<Sum<B1, E1>, Sum<B2, E2>>: Sub<Minimum<E1, E2>>,
Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>: Cast<Mantissa<R, B1>> + Cast<Mantissa<R, B2>> + Add<Output = Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>>,
Fixed-point addition
Fix<R, B1, E1> + Fix<R, B2, E2> = Fix<R, max(B1 + E1, B2 + E2) - min(E1, E2), min(E1, E2)>
BFix<32, -16> (Q16.16) + BFix<32, -24> (Q8.24) = BFix<40, -24> (Q40.24) BFix<32, 16> + BFix<32, 8> = BFix<40, 8>
Source§impl<R, B, E, T> AddAssign<T> for Fix<R, B, E>
impl<R, B, E, T> AddAssign<T> for Fix<R, B, E>
Source§fn add_assign(&mut self, other: T)
fn add_assign(&mut self, other: T)
+= operation. Read moreSource§impl<R, B1, E1, B2, E2> Div<Fix<R, B2, E2>> for Fix<R, B1, E1>
Fixed-point division
impl<R, B1, E1, B2, E2> Div<Fix<R, B2, E2>> for Fix<R, B1, E1>
Fixed-point division
Fix<R, B1, E1> / Fix<R, B2, E2> = Fix<R, B1 - B2, Base, E1 - E2>
Source§impl<R, B, E, T> DivAssign<T> for Fix<R, B, E>
impl<R, B, E, T> DivAssign<T> for Fix<R, B, E>
Source§fn div_assign(&mut self, other: T)
fn div_assign(&mut self, other: T)
/= operation. Read moreSource§impl<R, B1, E1, B2, E2> Mul<Fix<R, B2, E2>> for Fix<R, B1, E1>
Fixed-point multiplication
impl<R, B1, E1, B2, E2> Mul<Fix<R, B2, E2>> for Fix<R, B1, E1>
Fixed-point multiplication
Fix<R, B1, E1> * Fix<R, B2, E2> = Fix<R, B1 + B2, E1 + E2>
Source§impl<R, B, E, T> MulAssign<T> for Fix<R, B, E>
impl<R, B, E, T> MulAssign<T> for Fix<R, B, E>
Source§fn mul_assign(&mut self, other: T)
fn mul_assign(&mut self, other: T)
*= operation. Read moreSource§impl<R, B, E> Ord for Fix<R, B, E>
impl<R, B, E> Ord for Fix<R, B, E>
Source§impl<R, B, E> PartialOrd for Fix<R, B, E>
impl<R, B, E> PartialOrd for Fix<R, B, E>
Source§impl<R, B, E1, E2> RemAssign<Fix<R, B, E2>> for Fix<R, B, E1>
impl<R, B, E1, E2> RemAssign<Fix<R, B, E2>> for Fix<R, B, E1>
Source§fn rem_assign(&mut self, other: Fix<R, B, E2>)
fn rem_assign(&mut self, other: Fix<R, B, E2>)
%= operation. Read moreSource§impl<R, B1, E1, B2, E2> Sub<Fix<R, B2, E2>> for Fix<R, B1, E1>where
R: Radix<B1> + Radix<B2> + Radix<<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>,
B1: Digits + Add<E1>,
E1: Exponent + Min<E2>,
B2: Digits + Add<E2>,
E2: Exponent,
Sum<B1, E1>: Max<Sum<B2, E2>>,
Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>>: Add1,
<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output: Digits,
Minimum<E1, E2>: Exponent,
Maximum<Sum<B1, E1>, Sum<B2, E2>>: Sub<Minimum<E1, E2>>,
Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>: Cast<Mantissa<R, B1>> + Cast<Mantissa<R, B2>> + Sub<Output = Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>>,
Fixed-point substraction
impl<R, B1, E1, B2, E2> Sub<Fix<R, B2, E2>> for Fix<R, B1, E1>where
R: Radix<B1> + Radix<B2> + Radix<<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>,
B1: Digits + Add<E1>,
E1: Exponent + Min<E2>,
B2: Digits + Add<E2>,
E2: Exponent,
Sum<B1, E1>: Max<Sum<B2, E2>>,
Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>>: Add1,
<Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output: Digits,
Minimum<E1, E2>: Exponent,
Maximum<Sum<B1, E1>, Sum<B2, E2>>: Sub<Minimum<E1, E2>>,
Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>: Cast<Mantissa<R, B1>> + Cast<Mantissa<R, B2>> + Sub<Output = Mantissa<R, <Diff<Maximum<Sum<B1, E1>, Sum<B2, E2>>, Minimum<E1, E2>> as Add<P1>>::Output>>,
Fixed-point substraction
Fix<R, B1, E1> - Fix<R, B2, E2> = Fix<R, max(B1 + E1, B2 + E2) - min(E1, E2), min(E1, E2)>
Source§impl<R, B, E, T> SubAssign<T> for Fix<R, B, E>
impl<R, B, E, T> SubAssign<T> for Fix<R, B, E>
Source§fn sub_assign(&mut self, other: T)
fn sub_assign(&mut self, other: T)
-= operation. Read more