add public methods int_bits and frac_bits
This commit is contained in:
parent
e429dbd869
commit
1b74d10232
|
@ -35,6 +35,13 @@ fixed-point numbers.
|
|||
|
||||
## What’s new
|
||||
|
||||
### Version 0.1.1 (unreleased)
|
||||
|
||||
* New static methods [`int_bits`] and [`frac_bits`] were added.
|
||||
|
||||
[`frac_bits`]: https://docs.rs/fixed/0.1.0/fixed/struct.FixedI32.html#method.frac_bits
|
||||
[`int_bits`]: https://docs.rs/fixed/0.1.0/fixed/struct.FixedI32.html#method.int_bits
|
||||
|
||||
### Version 0.1.0 news (2018-08-10)
|
||||
|
||||
* [`Unsigned`] constants provided by the [*typenum* crate] are now
|
||||
|
|
|
@ -5,6 +5,11 @@ modification, are permitted in any medium without royalty provided the
|
|||
copyright notice and this notice are preserved. This file is offered
|
||||
as-is, without any warranty. -->
|
||||
|
||||
Version 0.1.1 (unreleased)
|
||||
==========================
|
||||
|
||||
* New static methods `int_bits` and `frac_bits` were added.
|
||||
|
||||
Version 0.1.0 (2018-08-10)
|
||||
==========================
|
||||
|
||||
|
|
|
@ -66,7 +66,8 @@ where
|
|||
R: Radix2,
|
||||
{
|
||||
let digit_bits: u32 = R::BITS.into();
|
||||
let (int_bits, frac_bits) = (F::int_bits(), F::frac_bits());
|
||||
let frac_bits = Frac::to_u32();
|
||||
let int_bits = F::bits() - frac_bits;
|
||||
let (is_neg, mut int, mut frac) = num.parts();
|
||||
// 128 binary digits, one radix point, one leading zero
|
||||
let mut buf: [u8; 130] = [0; 130];
|
||||
|
@ -187,7 +188,8 @@ fn fmt_dec<Frac: Unsigned, F>(num: F, fmt: &mut Formatter) -> FmtResult
|
|||
where
|
||||
F: FixedHelper<Frac>,
|
||||
{
|
||||
let (int_bits, frac_bits) = (F::int_bits(), F::frac_bits());
|
||||
let frac_bits = Frac::to_u32();
|
||||
let int_bits = F::bits() - frac_bits;
|
||||
let (is_neg, mut int, mut frac) = num.parts();
|
||||
// 40 int digits
|
||||
// + 128 frac digits
|
||||
|
|
|
@ -31,14 +31,6 @@ pub(crate) trait FixedHelper<Frac: Unsigned>: Sized {
|
|||
fn bits() -> u32 {
|
||||
mem::size_of::<Self::Part>() as u32 * 8
|
||||
}
|
||||
#[inline(always)]
|
||||
fn int_bits() -> u32 {
|
||||
Self::bits() - Self::frac_bits()
|
||||
}
|
||||
#[inline(always)]
|
||||
fn frac_bits() -> u32 {
|
||||
Frac::to_u32()
|
||||
}
|
||||
fn take_int_digit(int_part: &mut Self::Part, digit_bits: u32) -> u8;
|
||||
fn take_frac_digit(frac_part: &mut Self::Part, digit_bits: u32) -> u8;
|
||||
fn take_int_dec_digit(int_part: &mut Self::Part) -> u8;
|
||||
|
@ -107,8 +99,8 @@ macro_rules! fixed_num_unsigned {
|
|||
|
||||
#[inline]
|
||||
fn one() -> Option<Self> {
|
||||
let int_bits = <$Fixed<Frac> as FixedHelper<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac> as FixedHelper<Frac>>::frac_bits();
|
||||
let int_bits = <$Fixed<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac>>::frac_bits();
|
||||
if int_bits < 1 {
|
||||
None
|
||||
} else {
|
||||
|
@ -124,8 +116,8 @@ macro_rules! fixed_num_unsigned {
|
|||
#[inline]
|
||||
fn parts(self) -> (bool, $Part, $Part) {
|
||||
let bits = self.to_bits();
|
||||
let int_bits = <$Fixed<Frac> as FixedHelper<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac> as FixedHelper<Frac>>::frac_bits();
|
||||
let int_bits = <$Fixed<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac>>::frac_bits();
|
||||
let int_part = if int_bits == 0 { 0 } else { bits >> frac_bits };
|
||||
let frac_part = if frac_bits == 0 { 0 } else { bits << int_bits };
|
||||
(false, int_part, frac_part)
|
||||
|
@ -141,8 +133,8 @@ macro_rules! fixed_num_signed {
|
|||
|
||||
#[inline]
|
||||
fn one() -> Option<Self> {
|
||||
let int_bits = <$Fixed<Frac> as FixedHelper<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac> as FixedHelper<Frac>>::frac_bits();
|
||||
let int_bits = <$Fixed<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac>>::frac_bits();
|
||||
if int_bits < 2 {
|
||||
None
|
||||
} else {
|
||||
|
@ -152,8 +144,8 @@ macro_rules! fixed_num_signed {
|
|||
|
||||
#[inline]
|
||||
fn minus_one() -> Option<Self> {
|
||||
let int_bits = <$Fixed<Frac> as FixedHelper<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac> as FixedHelper<Frac>>::frac_bits();
|
||||
let int_bits = <$Fixed<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac>>::frac_bits();
|
||||
if int_bits < 1 {
|
||||
None
|
||||
} else {
|
||||
|
@ -164,8 +156,8 @@ macro_rules! fixed_num_signed {
|
|||
#[inline]
|
||||
fn parts(self) -> (bool, $Part, $Part) {
|
||||
let bits = self.to_bits().wrapping_abs() as $Part;
|
||||
let int_bits = <$Fixed<Frac> as FixedHelper<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac> as FixedHelper<Frac>>::frac_bits();
|
||||
let int_bits = <$Fixed<Frac>>::int_bits();
|
||||
let frac_bits = <$Fixed<Frac>>::frac_bits();
|
||||
let int_part = if int_bits == 0 { 0 } else { bits >> frac_bits };
|
||||
let frac_part = if frac_bits == 0 { 0 } else { bits << int_bits };
|
||||
(self.to_bits() < 0, int_part,frac_part)
|
||||
|
|
13
src/lib.rs
13
src/lib.rs
|
@ -488,6 +488,19 @@ macro_rules! fixed {
|
|||
"Returns the largest value that can be represented.",
|
||||
$Fixed($Inner) => fn max_value()
|
||||
}
|
||||
|
||||
/// Returns the number of integer bits.
|
||||
#[inline]
|
||||
pub fn int_bits() -> u32 {
|
||||
<$Fixed<Frac> as FixedHelper<Frac>>::bits() - <$Fixed<Frac>>::frac_bits()
|
||||
}
|
||||
|
||||
/// Returns the number of fractional bits.
|
||||
#[inline]
|
||||
pub fn frac_bits() -> u32 {
|
||||
Frac::to_u32()
|
||||
}
|
||||
|
||||
pass_method! {
|
||||
"Returns the number of ones in the binary representation.",
|
||||
$Fixed($Inner) => fn count_ones(self) -> u32
|
||||
|
|
Loading…
Reference in New Issue