lexical_util/extended_float.rs
1//! Extended precision floating-point type.
2//!
3//! Also contains helpers to convert to and from native rust floats.
4//! This representation stores the mantissa as a 64-bit unsigned integer,
5//! and the exponent as a 32-bit unsigned integer, allowed ~80 bits of
6//! precision (only 16 bits of the 32-bit integer are used, u32 is used
7//! for performance). Since there is no storage for the sign bit,
8//! this only works for positive floats.
9
10#![cfg(feature = "floats")]
11
12use crate::num::UnsignedInteger;
13
14/// Extended precision floating-point type.
15///
16/// This doesn't have any methods because it's used for **very** different
17/// things for the Lemire, Bellepheron, and other algorithms. In Grisu,
18/// it's an unbiased representation, for Lemire, it's a biased representation.
19#[derive(Clone, Copy, Debug, PartialEq, Eq)]
20pub struct ExtendedFloat<M: UnsignedInteger> {
21 /// Mantissa for the extended-precision float.
22 pub mant: M,
23 /// Binary exponent for the extended-precision float.
24 pub exp: i32,
25}
26
27impl<M: UnsignedInteger> ExtendedFloat<M> {
28 /// Get the mantissa component.
29 #[inline(always)]
30 pub fn mantissa(&self) -> M {
31 self.mant
32 }
33
34 /// Get the exponent component.
35 #[inline(always)]
36 pub fn exponent(&self) -> i32 {
37 self.exp
38 }
39}