From b1ae2c24e595f756d95f9163904bd7919e9f35d5 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 22 Jul 2014 09:07:25 +0900 Subject: [PATCH] rewrite exact-integer-sqrt in c --- piclib/prelude.scm | 12 ------------ src/number.c | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 12 deletions(-) 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);