pub struct BigNumBase<T>where
T: Base,{
pub sig: u64,
pub exp: u64,
pub base: T,
}
Expand description
This is the main struct for bignumbe-rs
.
It takes a generic argument for the base, e.g.
BigNumBase<Binary>
. It is recommended to either create a custom type alias or
use one of the predefined ones (BigNumBin, BigNumOct, BigNumDec, BigNumHex
). You
should be able to use them pretty much exactly like other numbers in most contexts.
For convenience I define From
and all math operations for u64
, but keep in mind
that the From
implementation, like new
, involves recalculating the base ranges.
use bignumbe_rs::{BigNumBase, Binary};
type BigNum = BigNumBase<Binary>;
let bn1 = BigNum::from(1);
let bn2 = BigNum::from(u64::MAX);
// Since this operation's result doesn't fit in `u64` it wraps over to the minimum
// significand and increments the `exp`
assert_eq!(bn1 + bn2, BigNum::new(1 << 63, 1));
assert_eq!(bn1 / bn2, BigNum::from(0));
assert_eq!(bn1 * bn2, bn2);
assert_eq!(bn2 * bn2, BigNum::new(u64::MAX - 1, 64));
Fields§
§sig: u64
§exp: u64
§base: T
Implementations§
Source§impl<T> BigNumBase<T>where
T: Base,
impl<T> BigNumBase<T>where
T: Base,
Sourcepub fn new(sig: u64, exp: u64) -> Self
pub fn new(sig: u64, exp: u64) -> Self
Creates a new BigNumBase
instance that represents the value
sig * T::NUMBER^exp
. E.g. BigNumBin::new(12341234, 12341)
represents
12341234 * 2^12341
. This method will perform normalization if necessary, to
ensure the significand is in the valid range (if the number is non-compact). As
such when creating a BigNum from scratch you should always use this unless you
absolutely need a raw constructor
Sourcepub fn new_raw(sig: u64, exp: u64) -> Self
pub fn new_raw(sig: u64, exp: u64) -> Self
Creates a BigNumBase directly from values, panicking if not possible. This is mostly for testing but may be more performant on inputs that are guaranteed valid
Sourcepub fn fuzzy_eq(self, other: Self, margin: u64) -> bool
pub fn fuzzy_eq(self, other: Self, margin: u64) -> bool
Allows fuzzy comparison between two values. Since operations can result in loss of
precision this allows you to compare values that may have drifted. Since each
operation can result in an error of 1, an upper bound is the sum of the number of
operations performed on each operand. E.g. for n: BigNumDec
, to ensure that
(n * 1000) / 500 = (n / 500) * 1000, you might use a margin of 4
Trait Implementations§
Source§impl<T> Add<BigNumBase<T>> for u64where
T: Base,
impl<T> Add<BigNumBase<T>> for u64where
T: Base,
Source§type Output = BigNumBase<T>
type Output = BigNumBase<T>
+
operator.Source§impl<T> Add for BigNumBase<T>where
T: Base,
impl<T> Add for BigNumBase<T>where
T: Base,
Source§impl<T> AddAssign<u64> for BigNumBase<T>where
T: Base,
impl<T> AddAssign<u64> for BigNumBase<T>where
T: Base,
Source§fn add_assign(&mut self, rhs: u64)
fn add_assign(&mut self, rhs: u64)
+=
operation. Read moreSource§impl<T> AddAssign for BigNumBase<T>where
T: Base,
impl<T> AddAssign for BigNumBase<T>where
T: Base,
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+=
operation. Read moreSource§impl<T> Clone for BigNumBase<T>
impl<T> Clone for BigNumBase<T>
Source§fn clone(&self) -> BigNumBase<T>
fn clone(&self) -> BigNumBase<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<T> Debug for BigNumBase<T>
impl<T> Debug for BigNumBase<T>
Source§impl Display for BigNumBase<Decimal>
impl Display for BigNumBase<Decimal>
Source§impl<T> Div<BigNumBase<T>> for u64where
T: Base,
impl<T> Div<BigNumBase<T>> for u64where
T: Base,
Source§type Output = BigNumBase<T>
type Output = BigNumBase<T>
/
operator.Source§impl<T> Div for BigNumBase<T>where
T: Base,
impl<T> Div for BigNumBase<T>where
T: Base,
Source§impl<T> DivAssign<u64> for BigNumBase<T>where
T: Base,
impl<T> DivAssign<u64> for BigNumBase<T>where
T: Base,
Source§fn div_assign(&mut self, rhs: u64)
fn div_assign(&mut self, rhs: u64)
/=
operation. Read moreSource§impl<T> Mul<BigNumBase<T>> for u64where
T: Base,
impl<T> Mul<BigNumBase<T>> for u64where
T: Base,
Source§type Output = BigNumBase<T>
type Output = BigNumBase<T>
*
operator.Source§impl<T> Mul for BigNumBase<T>where
T: Base,
impl<T> Mul for BigNumBase<T>where
T: Base,
Source§impl<T> MulAssign<f64> for BigNumBase<T>where
T: Base,
impl<T> MulAssign<f64> for BigNumBase<T>where
T: Base,
Source§fn mul_assign(&mut self, rhs: f64)
fn mul_assign(&mut self, rhs: f64)
*=
operation. Read moreSource§impl<T> MulAssign<u64> for BigNumBase<T>where
T: Base,
impl<T> MulAssign<u64> for BigNumBase<T>where
T: Base,
Source§fn mul_assign(&mut self, rhs: u64)
fn mul_assign(&mut self, rhs: u64)
*=
operation. Read moreSource§impl<T> MulAssign for BigNumBase<T>where
T: Base,
impl<T> MulAssign for BigNumBase<T>where
T: Base,
Source§fn mul_assign(&mut self, rhs: Self)
fn mul_assign(&mut self, rhs: Self)
*=
operation. Read moreSource§impl<T> Ord for BigNumBase<T>where
T: Base,
impl<T> Ord for BigNumBase<T>where
T: Base,
Source§impl<T> PartialEq for BigNumBase<T>where
T: Base,
impl<T> PartialEq for BigNumBase<T>where
T: Base,
Source§impl<T> PartialOrd for BigNumBase<T>where
T: Base,
impl<T> PartialOrd for BigNumBase<T>where
T: Base,
Source§impl<T> Product for BigNumBase<T>where
T: Base,
impl<T> Product for BigNumBase<T>where
T: Base,
Source§impl<T> Sub<BigNumBase<T>> for u64where
T: Base,
impl<T> Sub<BigNumBase<T>> for u64where
T: Base,
Source§type Output = BigNumBase<T>
type Output = BigNumBase<T>
-
operator.Source§impl<T> Sub for BigNumBase<T>where
T: Base,
impl<T> Sub for BigNumBase<T>where
T: Base,
Source§impl<T> SubAssign<u64> for BigNumBase<T>where
T: Base,
impl<T> SubAssign<u64> for BigNumBase<T>where
T: Base,
Source§fn sub_assign(&mut self, rhs: u64)
fn sub_assign(&mut self, rhs: u64)
-=
operation. Read moreSource§impl<T> SubAssign for BigNumBase<T>where
T: Base,
impl<T> SubAssign for BigNumBase<T>where
T: Base,
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-=
operation. Read more