Adding more support for working with u64s.

This commit is contained in:
Eric Holk 2011-07-08 12:18:54 -07:00
parent 4c309321e0
commit 79ca673af7
4 changed files with 54 additions and 7 deletions

View File

@ -12,6 +12,7 @@
mod int;
mod uint;
mod u8;
mod u64;
mod vec;
mod ivec;
mod str;

39
src/lib/u64.rs Normal file
View File

@ -0,0 +1,39 @@
fn to_str(u64 n, uint radix) -> str {
assert(0u < radix && radix <= 16u);
auto r64 = radix as u64;
fn digit(u64 n) -> str {
ret alt (n) {
case (0u64) { "0" }
case (1u64) { "1" }
case (2u64) { "2" }
case (3u64) { "3" }
case (4u64) { "4" }
case (5u64) { "5" }
case (6u64) { "6" }
case (7u64) { "7" }
case (8u64) { "8" }
case (9u64) { "9" }
case (10u64) { "a" }
case (11u64) { "b" }
case (12u64) { "c" }
case (13u64) { "d" }
case (14u64) { "e" }
case (15u64) { "f" }
case (_) { fail }
};
}
if n == 0u64 { ret "0"; }
auto s = "";
while(n > 0u64) {
s = digit(n % r64) + s;
n /= r64;
}
ret s;
}
fn str(u64 n) -> str { ret to_str(n, 10u); }

View File

@ -55,10 +55,15 @@ fn main(vec[str] argv) {
auto fibn = fib(n);
auto stop = time::precise_time_ns();
auto elapsed = (stop - start) as int;
auto us_task = elapsed / fibn / 1000;
assert(stop >= start);
log_err #fmt("Determined that fib(%d) = %d in %d ns (%d us / task)",
n, fibn, elapsed, us_task);
auto elapsed = stop - start;
auto us_task = elapsed / (fibn as u64) / (1000 as u64);
log_err #fmt("Determined that fib(%d) = %d in %d%d ns (%d us / task)",
n, fibn,
(elapsed / (1000000 as u64)) as int,
(elapsed % (1000000 as u64)) as int,
us_task as int);
}
}

View File

@ -19,6 +19,7 @@ import std::int::range;
import std::io;
import std::getopts;
import std::task;
import std::u64;
fn recv[T](&port[T] p) -> T {
let T x;
@ -106,16 +107,17 @@ fn main(vec[str] argv) {
auto num_trials = 10;
auto out = io::stdout();
for each(int n in range(1, max + 1)) {
for each(int i in range(0, num_trials)) {
auto start = time::precise_time_ns();
auto fibn = fib(n);
auto stop = time::precise_time_ns();
auto elapsed = (stop - start) as int;
auto elapsed = stop - start;
out.write_line(#fmt("%d\t%d\t%d", n, fibn, elapsed));
out.write_line(#fmt("%d\t%d\t%s", n, fibn,
u64::str(elapsed)));
}
}
}