add public methods int_bits and frac_bits

This commit is contained in:
Trevor Spiteri 2018-08-10 21:28:24 +02:00
parent e429dbd869
commit 1b74d10232
5 changed files with 39 additions and 20 deletions

View File

@ -35,6 +35,13 @@ fixed-point numbers.
## Whats 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

View File

@ -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)
==========================

View File

@ -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

View File

@ -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)

View File

@ -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