@@ -65,11 +65,9 @@ impl Number {
65
65
Some ( if e_diff == 0 {
66
66
self . mantissa
67
67
} 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 ) )
70
69
} 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 ) )
73
71
} )
74
72
}
75
73
@@ -89,9 +87,9 @@ impl Number {
89
87
Some ( if e_diff == 0 {
90
88
num
91
89
} 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 )
93
91
} else {
94
- num. wrapping_mul ( 10i64 . pow ( e_diff as u32 ) )
92
+ num. wrapping_mul ( decimal_power ( e_diff as u16 ) as i64 )
95
93
} )
96
94
}
97
95
}
@@ -113,13 +111,13 @@ impl PartialEq for Number {
113
111
if e_diff == 0 {
114
112
return self . mantissa == other. mantissa ;
115
113
} 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
119
117
} 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 )
123
121
}
124
122
125
123
}
@@ -412,3 +410,35 @@ impl ops::MulAssign for Number {
412
410
* self = * self * other;
413
411
}
414
412
}
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