#![forbid(unsafe_code)]
pub use oxinum_core::{OxiNumError, OxiNumResult, ParseNumberError, RoundingMode, Sign};
pub use oxinum_int::{
binomial, extended_gcd, factorial, fibonacci, is_prime, lucas, mod_pow, next_prime, BigInt,
BigUint, Gcd, IBig, UBig,
};
pub use oxinum_float::{
atan, atan2, compute_e, compute_ln2, compute_pi, cos, cosh, exp, ln, pow, sin, sinh, sqrt, tan,
tanh, BigFloat, Context, DBig, FBig,
};
pub use oxinum_rational::{
best_rational_approximation, continued_fraction, from_continued_fraction, mediant,
mixed_number, rational_abs, rational_ceil, rational_floor, rational_pow, rational_reciprocal,
rational_round, rational_signum, rational_truncate, to_decimal_string, BigRational, RBig,
Relaxed,
};
pub use oxinum_complex::CBig;
pub mod round {
pub use oxinum_float::round::*;
}
pub type Int = oxinum_int::IBig;
pub type Natural = oxinum_int::UBig;
pub type Float = oxinum_float::DBig;
pub type Rational = oxinum_rational::RBig;
pub type Complex = oxinum_complex::CBig;
pub mod native {
pub use oxinum_float::native::{BigFloat, RoundingMode};
pub use oxinum_int::native::{
checked_divrem, divrem, divrem_int, factorial, gcd, gcd_binary, gcd_extended, gcd_int,
is_probably_prime, mod_inv, mod_mul, mod_pow, prime_sieve, BigInt, BigUint,
MontgomeryContext, KARATSUBA_THRESHOLD, NEWTON_DIV_THRESHOLD,
};
pub use oxinum_rational::native::BigRational;
pub use oxinum_complex::native::BigComplex;
pub type Int = BigInt;
pub type Natural = BigUint;
pub type Float = BigFloat;
pub type Rational = BigRational;
pub type Complex = BigComplex;
}
pub mod constants;
pub mod convert;
pub mod prelude;
mod parse;
pub use parse::{parse, ParsedNumber};
pub fn version() -> &'static str {
env!("CARGO_PKG_VERSION")
}
#[cfg(test)]
mod tests {
use super::*;
use std::str::FromStr;
#[test]
fn version_is_nonempty() {
assert!(!super::version().is_empty());
}
#[test]
fn facade_ubig() {
let n = UBig::from(100u32);
assert_eq!(n.to_string(), "100");
}
#[test]
fn facade_ibig_negative() {
let n = IBig::from(-1i32);
assert_eq!(n.to_string(), "-1");
}
#[test]
fn facade_dbig() {
let n: DBig = DBig::from(1u32);
assert_eq!(n.to_string(), "1");
}
#[test]
fn facade_rbig() {
let n = RBig::from(7u32);
assert_eq!(n.to_string(), "7");
}
#[test]
fn facade_context_round() {
let ctx = Context::<round::HalfAway>::new(50usize);
assert_eq!(
format!("{ctx:?}"),
"Context { precision: 50, rounding: HalfAway }"
);
}
#[test]
fn facade_relaxed() {
let r: Relaxed = Relaxed::from(1u32);
assert_eq!(r.to_string(), "1");
}
#[test]
fn facade_dbig_from_str() {
let d = DBig::from_str("2.718281828").expect("valid decimal");
assert!(d.to_string().starts_with("2.718"));
}
#[test]
fn facade_type_aliases() {
let i: Int = Int::from(42);
let n: Natural = Natural::from(42u32);
let r: Rational = Rational::from(42u32);
assert_eq!(i.to_string(), "42");
assert_eq!(n.to_string(), "42");
assert_eq!(r.to_string(), "42");
}
#[test]
fn facade_cbig() {
let z = CBig::from_f64(3.0, 4.0).expect("finite parts");
assert_eq!(z.norm_sqr().to_string(), "25");
let w: Complex = z.conj();
assert_eq!(w.im().to_string(), "-4");
}
#[test]
fn facade_native_big_complex() {
use native::{BigComplex, BigFloat, RoundingMode};
let re = BigFloat::from_i64(3, 64, RoundingMode::HalfEven);
let im = BigFloat::from_i64(4, 64, RoundingMode::HalfEven);
let z: native::Complex = BigComplex::new(re, im);
assert_eq!(z.norm_sqr().to_f64().round(), 25.0);
}
#[test]
fn facade_number_theory() {
assert_eq!(factorial(5), UBig::from(120u32));
assert_eq!(fibonacci(10), UBig::from(55u32));
assert!(is_prime(&UBig::from(17u32), 0));
}
}