diff --git a/piclib/prelude.scm b/piclib/prelude.scm index 6245f678..d7a191f5 100644 --- a/piclib/prelude.scm +++ b/piclib/prelude.scm @@ -589,18 +589,6 @@ s (fold f (f (car xs) s) (cdr xs)))) -;;; 6.2. Numbers - -; (import (only (scheme inexact) sqrt)) -(import (scheme inexact)) - -(define (exact-integer-sqrt k) - (let ((n (exact (floor (sqrt k))))) - (values n (- k (square n))))) - -(export floor/ truncate/ - exact-integer-sqrt) - ;;; 6.3 Booleans (define (boolean=? . objs) diff --git a/src/number.c b/src/number.c index b7b32aea..8e15860a 100644 --- a/src/number.c +++ b/src/number.c @@ -661,6 +661,19 @@ pic_number_atan(pic_state *pic) } } +static pic_value +pic_number_exact_integer_sqrt(pic_state *pic) +{ + int k, n, m; + + pic_get_args(pic, "i", &k); + + n = sqrt(k); + m = k - n * n; + + return pic_values2(pic, pic_int_value(n), pic_int_value(m)); +} + static pic_value pic_number_square(pic_state *pic) { @@ -840,6 +853,7 @@ pic_init_number(pic_state *pic) pic_defun(pic, "round", pic_number_round); pic_gc_arena_restore(pic, ai); + pic_defun(pic, "exact-integer-sqrt", pic_number_exact_integer_sqrt); pic_defun(pic, "square", pic_number_square); pic_defun(pic, "expt", pic_number_expt); pic_gc_arena_restore(pic, ai);