Skip to content

Commit 1d44385

Browse files
committed
Use cached powers of 10
1 parent c2c6de5 commit 1d44385

File tree

1 file changed

+42
-12
lines changed

1 file changed

+42
-12
lines changed

src/number.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,9 @@ impl Number {
6565
Some(if e_diff == 0 {
6666
self.mantissa
6767
} else if e_diff < 0 {
68-
// TODO: use cached powers
69-
self.mantissa.wrapping_div(10u64.pow(-e_diff as u32))
68+
self.mantissa.wrapping_div(decimal_power(-e_diff as u16))
7069
} else {
71-
// TODO: use cached powers
72-
self.mantissa.wrapping_mul(10u64.pow(e_diff as u32))
70+
self.mantissa.wrapping_mul(decimal_power(e_diff as u16))
7371
})
7472
}
7573

@@ -89,9 +87,9 @@ impl Number {
8987
Some(if e_diff == 0 {
9088
num
9189
} else if e_diff < 0 {
92-
num.wrapping_div(10i64.pow(-e_diff as u32))
90+
num.wrapping_div(decimal_power(-e_diff as u16) as i64)
9391
} else {
94-
num.wrapping_mul(10i64.pow(e_diff as u32))
92+
num.wrapping_mul(decimal_power(e_diff as u16) as i64)
9593
})
9694
}
9795
}
@@ -113,13 +111,13 @@ impl PartialEq for Number {
113111
if e_diff == 0 {
114112
return self.mantissa == other.mantissa;
115113
} else if e_diff > 0 {
116-
// TODO: use cached powers
117-
self.mantissa
118-
.wrapping_mul(10u64.pow(e_diff as u32)) == other.mantissa
114+
let power = decimal_power(e_diff as u16);
115+
116+
self.mantissa.wrapping_mul(power) == other.mantissa
119117
} else {
120-
// TODO: use cached powers
121-
self.mantissa == other.mantissa
122-
.wrapping_mul(10u64.pow(-e_diff as u32))
118+
let power = decimal_power(-e_diff as u16);
119+
120+
self.mantissa == other.mantissa.wrapping_mul(power)
123121
}
124122

125123
}
@@ -412,3 +410,35 @@ impl ops::MulAssign for Number {
412410
*self = *self * other;
413411
}
414412
}
413+
414+
#[inline]
415+
fn decimal_power(e: u16) -> u64 {
416+
static CACHED: [u64; 20] = [
417+
1,
418+
10,
419+
100,
420+
1000,
421+
10000,
422+
100000,
423+
1000000,
424+
10000000,
425+
100000000,
426+
1000000000,
427+
10000000000,
428+
100000000000,
429+
1000000000000,
430+
10000000000000,
431+
100000000000000,
432+
1000000000000000,
433+
10000000000000000,
434+
100000000000000000,
435+
1000000000000000000,
436+
10000000000000000000,
437+
];
438+
439+
if e < 20 {
440+
CACHED[e as usize]
441+
} else {
442+
10u64.pow(e as u32)
443+
}
444+
}

0 commit comments

Comments
 (0)