@@ -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