Skip to content

Commit bd29cec

Browse files
committed
Refactor diy_float
1 parent ab5b1be commit bd29cec

File tree

1 file changed

+11
-43
lines changed

1 file changed

+11
-43
lines changed

library/core/src/num/diy_float.rs

Lines changed: 11 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,61 +21,29 @@ pub struct Fp {
2121

2222
impl Fp {
2323
/// Returns a correctly rounded product of itself and `other`.
24-
pub fn mul(&self, other: &Fp) -> Fp {
25-
const MASK: u64 = 0xffffffff;
26-
let a = self.f >> 32;
27-
let b = self.f & MASK;
28-
let c = other.f >> 32;
29-
let d = other.f & MASK;
30-
let ac = a * c;
31-
let bc = b * c;
32-
let ad = a * d;
33-
let bd = b * d;
34-
let tmp = (bd >> 32) + (ad & MASK) + (bc & MASK) + (1 << 31) /* round */;
35-
let f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
24+
pub fn mul(&self, other: Self) -> Self {
25+
let (lo, hi) = self.f.widening_mul(other.f);
26+
let f = hi + (lo >> 63) /* round */;
3627
let e = self.e + other.e + 64;
37-
Fp { f, e }
28+
Self { f, e }
3829
}
3930

4031
/// Normalizes itself so that the resulting mantissa is at least `2^63`.
41-
pub fn normalize(&self) -> Fp {
42-
let mut f = self.f;
43-
let mut e = self.e;
44-
if f >> (64 - 32) == 0 {
45-
f <<= 32;
46-
e -= 32;
47-
}
48-
if f >> (64 - 16) == 0 {
49-
f <<= 16;
50-
e -= 16;
51-
}
52-
if f >> (64 - 8) == 0 {
53-
f <<= 8;
54-
e -= 8;
55-
}
56-
if f >> (64 - 4) == 0 {
57-
f <<= 4;
58-
e -= 4;
59-
}
60-
if f >> (64 - 2) == 0 {
61-
f <<= 2;
62-
e -= 2;
63-
}
64-
if f >> (64 - 1) == 0 {
65-
f <<= 1;
66-
e -= 1;
67-
}
32+
pub fn normalize(self) -> Self {
33+
let lz = self.f.leading_zeros();
34+
let f = self.f << lz;
35+
let e = self.e - lz as i16;
6836
debug_assert!(f >= (1 << 63));
69-
Fp { f, e }
37+
Self { f, e }
7038
}
7139

7240
/// Normalizes itself to have the shared exponent.
7341
/// It can only decrease the exponent (and thus increase the mantissa).
74-
pub fn normalize_to(&self, e: i16) -> Fp {
42+
pub fn normalize_to(self, e: i16) -> Self {
7543
let edelta = self.e - e;
7644
assert!(edelta >= 0);
7745
let edelta = edelta as usize;
7846
assert_eq!(self.f << edelta >> edelta, self.f);
79-
Fp { f: self.f << edelta, e }
47+
Self { f: self.f << edelta, e }
8048
}
8149
}

0 commit comments

Comments
 (0)