I was practicing Scheme in Guile 1.8.8
interpreter on OS X. I noticed something interesting.
Here's expt
function which is basically does exponentiation expt(b,n) = b^n
:
(define (square x) (* x x))
(define (even? x) (= (remainder x 2) 0))
(define (expt b n)
(cond ((= n 0) 1)
((even? n) (square (expt b (/ n 2))))
(else (* b (expt b (- n 1))))
))
If I try it with some inputs
> (expt 2 10)
1024
> (expt 2 63)
9223372036854775808
Here comes the strange part:
> (expt 2 64)
0
More strangely, until n=488
it stays at 0
:
> (expt 2 487)
0
> (expt 2 488)
79916762888089401123.....
> (expt 2 1000)
1071508607186267320948425049060....
> (expt 2 10000)
0
When I try this code with repl.it online interpreter, it works as expected. So what the hell is wrong with Guile?
(Note: On some dialects, remainder
function is called as mod
.)
expt
tomy-expt
. Just to rule out any confusion over whether the problem is yourexpt
or the builtinexpt
. – Ragamuffinremainder
andmodulo
works differently for negative numbers. – Ragamuffin