Skip to content

Commit 832fe96

Browse files
committed
---
yaml --- r: 148444 b: refs/heads/try2 c: 509283d h: refs/heads/master v: v3
1 parent f71208a commit 832fe96

File tree

2 files changed

+31
-43
lines changed

2 files changed

+31
-43
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: cf56624a4ad7703c8f3fc327b8c385da0a803ea5
8+
refs/heads/try2: 509283d149bb81cad728b2c1b81f7ab8ceb206e1
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/num/mod.rs

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -304,48 +304,29 @@ pub trait Real: Signed
304304
fn to_radians(&self) -> Self;
305305
}
306306

307-
/// Raises a value to the power of exp, using
308-
/// exponentiation by squaring.
307+
/// Raises a value to the power of exp, using exponentiation by squaring.
309308
///
310309
/// # Example
311310
///
312311
/// ```rust
313312
/// use std::num;
314313
///
315-
/// let sixteen = num::pow(2, 4u);
316-
/// assert_eq!(sixteen, 16);
314+
/// assert_eq!(num::pow(2, 4), 16);
317315
/// ```
318316
#[inline]
319-
pub fn pow<T: Clone+One+Mul<T, T>>(num: T, exp: uint) -> T {
320-
let one: uint = One::one();
321-
let num_one: T = One::one();
322-
323-
if exp.is_zero() { return num_one; }
324-
if exp == one { return num.clone(); }
325-
326-
let mut i: uint = exp;
327-
let mut v: T;
328-
let mut r: T = num_one;
329-
330-
// This if is to avoid cloning self.
331-
if (i & one) == one {
332-
r = r * num;
333-
i = i - one;
334-
}
335-
336-
i = i >> one;
337-
v = num * num;
338-
339-
while !i.is_zero() {
340-
if (i & one) == one {
341-
r = r * v;
342-
i = i - one;
317+
pub fn pow<T: One + Mul<T, T>>(mut base: T, mut exp: uint) -> T {
318+
if exp == 1 { base }
319+
else {
320+
let mut acc = one::<T>();
321+
while exp > 0 {
322+
if (exp & 1) == 1 {
323+
acc = acc * base;
324+
}
325+
base = base * base;
326+
exp = exp >> 1;
343327
}
344-
i = i >> one;
345-
v = v * v;
328+
acc
346329
}
347-
348-
r
349330
}
350331

351332
/// Raise a number to a power.
@@ -1670,17 +1651,24 @@ mod tests {
16701651

16711652
#[test]
16721653
fn test_pow() {
1673-
fn assert_pow<T: Eq+Clone+One+Mul<T, T>>(num: T, exp: uint) -> () {
1674-
assert_eq!(num::pow(num.clone(), exp),
1675-
range(1u, exp).fold(num.clone(), |acc, _| acc * num));
1654+
fn naive_pow<T: One + Mul<T, T>>(base: T, exp: uint) -> T {
1655+
range(0, exp).fold(one::<T>(), |acc, _| acc * base)
16761656
}
1677-
1678-
assert_eq!(num::pow(3, 0), 1);
1679-
assert_eq!(num::pow(5, 1), 5);
1680-
assert_pow(-4, 2);
1681-
assert_pow(8, 3);
1682-
assert_pow(8, 5);
1683-
assert_pow(2u64, 50);
1657+
macro_rules! assert_pow(
1658+
(($num:expr, $exp:expr) => $expected:expr) => {{
1659+
let result = pow($num, $exp);
1660+
assert_eq!(result, $expected);
1661+
assert_eq!(result, naive_pow($num, $exp));
1662+
}}
1663+
)
1664+
assert_pow!((3, 0 ) => 1);
1665+
assert_pow!((5, 1 ) => 5);
1666+
assert_pow!((-4, 2 ) => 16);
1667+
assert_pow!((0.5, 5 ) => 0.03125);
1668+
assert_pow!((8, 3 ) => 512);
1669+
assert_pow!((8.0, 5 ) => 32768.0);
1670+
assert_pow!((8.5, 5 ) => 44370.53125);
1671+
assert_pow!((2u64, 50) => 1125899906842624);
16841672
}
16851673
}
16861674

0 commit comments

Comments
 (0)