[plt-scheme] Integer-length
Jacob Matthews wrote:
> This seems to beat both Jens' or Joe's implementation handily, at least
> in drscheme 301.11 --
>
> (define (log2 n) (/ (log n) (log 2)))
> (define (integer-length n)
> (cond
> [(< n 0) (error 'integer-length
> "a non-negative integer was
> expected, got: " n)]
> [(= n 0) 1]
> [else (add1 (floor (log2 n)))]))
This works fine in the range I am working with. I checked that
it returns the same results for all numbers up 1000000.
I dug up this snippet from math-repl:
(define integer-log2
(let ([log2 (log 2)])
(lambda (n)
(/ (log n) log2))))
(define (big-log2 n)
(define (loop n l)
(if (<= n 1)
l
(loop (quotient n 2) (add1 l))))
(loop n 0))
So there might be a problem with very large numbers.
> The speedup is probably because mzscheme's log is implemented in C.
Indeed.
--
Jens Axel Søgaard