1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
mod e;
mod ln10;
mod ln2;
mod pi;
use crate::common::util::round_p;
use crate::ops::consts::e::ECache;
use crate::ops::consts::ln10::Ln10Cache;
use crate::ops::consts::ln2::Ln2Cache;
use crate::ops::consts::pi::PiCache;
use crate::BigFloatNumber;
use crate::Error;
use crate::RoundingMode;
/// Constants cache contains arbitrary-precision mathematical constants.
pub struct Consts {
pi: PiCache,
e: ECache,
ln2: Ln2Cache,
ln10: Ln10Cache,
}
/// In an ideal situation, the `Consts` structure is initialized with `Consts::new` only once,
/// and then used where needed.
impl Consts {
/// Initializes the constants cache.
///
/// ## Errors
///
/// - MemoryAllocation: failed to allocate memory for mantissa.
pub fn new() -> Result<Self, Error> {
Ok(Consts {
pi: PiCache::new()?,
e: ECache::new()?,
ln2: Ln2Cache::new()?,
ln10: Ln10Cache::new()?,
})
}
/// Returns the value of the pi number with precision `p` using rounding mode `rm`.
/// Precision is rounded upwards to the word size.
///
/// ## Errors
///
/// - MemoryAllocation: failed to allocate memory for mantissa.
/// - InvalidArgument: the precision is incorrect.
pub fn pi(&mut self, p: usize, rm: RoundingMode) -> Result<BigFloatNumber, Error> {
let p = round_p(p);
self.pi.for_prec(p, rm)
}
/// Returns the value of the Euler number with precision `p` using rounding mode `rm`.
/// Precision is rounded upwards to the word size.
///
/// ## Errors
///
/// - MemoryAllocation: failed to allocate memory for mantissa.
/// - InvalidArgument: the precision is incorrect.
pub fn e(&mut self, p: usize, rm: RoundingMode) -> Result<BigFloatNumber, Error> {
let p = round_p(p);
self.e.for_prec(p, rm)
}
/// Returns the value of the natural logarithm of 2 with precision `p` using rounding mode `rm`.
/// Precision is rounded upwards to the word size.
///
/// ## Errors
///
/// - MemoryAllocation: failed to allocate memory for mantissa.
/// - InvalidArgument: the precision is incorrect.
pub fn ln_2(&mut self, p: usize, rm: RoundingMode) -> Result<BigFloatNumber, Error> {
let p = round_p(p);
self.ln2.for_prec(p, rm)
}
/// Returns the value of the natural logarithm of 10 with precision `p` using rounding mode `rm`.
/// Precision is rounded upwards to the word size.
///
/// ## Errors
///
/// - MemoryAllocation: failed to allocate memory for mantissa.
/// - InvalidArgument: the precision is incorrect.
pub fn ln_10(&mut self, p: usize, rm: RoundingMode) -> Result<BigFloatNumber, Error> {
let p = round_p(p);
self.ln10.for_prec(p, rm)
}
}