Merge pull request #65 from cuviper/pow-overflow
pow: avoid unnecessary overflows
This commit is contained in:
commit
65226fdd06
|
@ -121,7 +121,8 @@ pub fn abs_sub<T: Signed>(x: T, y: T) -> T {
|
|||
/// ```rust
|
||||
/// use num;
|
||||
///
|
||||
/// assert_eq!(num::pow(2i, 4), 16);
|
||||
/// assert_eq!(num::pow(2i8, 4), 16);
|
||||
/// assert_eq!(num::pow(6u8, 3), 216);
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn pow<T: Clone + One + Mul<T, Output = T>>(mut base: T, mut exp: usize) -> T {
|
||||
|
@ -132,7 +133,11 @@ pub fn pow<T: Clone + One + Mul<T, Output = T>>(mut base: T, mut exp: usize) ->
|
|||
if (exp & 1) == 1 {
|
||||
acc = acc * base.clone();
|
||||
}
|
||||
base = base.clone() * base;
|
||||
|
||||
// avoid overflow if we won't need it
|
||||
if exp > 1 {
|
||||
base = base.clone() * base;
|
||||
}
|
||||
exp = exp >> 1;
|
||||
}
|
||||
acc
|
||||
|
|
Loading…
Reference in New Issue