Hi!

Mark H Weaver <m...@netris.org> writes:

> exact-integer-sqrt is broken.  It is now implemented in (rnrs base) by
> doing an inexact sqrt and coercing the answer to exact.  This fails
> badly for large integers:
>
>   scheme@(guile-user)> (use-modules ((rnrs base) #:version (6)))
>   scheme@(guile-user)> (exact-integer-sqrt (expt 10 50))
>   $1 = 10000000000000000905969664
>   $2 = -18119393280000000820781032088272896
>
> This patch adds a proper implementation to guile core, which does this:
>
>   scheme@(guile-user)> (exact-integer-sqrt (expt 10 50))
>   $1 = 10000000000000000000000000
>   $2 = 0
>
> I'd like to push this to stable-2.0.  Any objections?

Not from me!

One remark:

> --- a/libguile/numbers.h
> +++ b/libguile/numbers.h
> @@ -289,6 +289,7 @@ SCM_API SCM scm_log (SCM z);
>  SCM_API SCM scm_log10 (SCM z);
>  SCM_API SCM scm_exp (SCM z);
>  SCM_API SCM scm_sqrt (SCM z);
> +SCM_API void scm_exact_integer_sqrt (SCM k, SCM *s, SCM *r);

Shouldn’t it be SCM_INTERNAL?  (If yes, then the doc should use @deffn
instead of @deftypefn.)

Thanks,
Ludo’.


Reply via email to