From 52001c7d5e754871dcf166d8234eee950a36c4c4 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 14 Apr 2013 05:01:08 +0000 Subject: [PATCH] Adding a sanity check in sexp_bignum_sqrt. --- bignum.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bignum.c b/bignum.c index de697f98..cea27514 100644 --- a/bignum.c +++ b/bignum.c @@ -479,14 +479,16 @@ sexp sexp_bignum_expt (sexp ctx, sexp a, sexp b) { #if SEXP_USE_MATH -#define SEXP_MAX_ACCURATE_FLONUM_SQRT 1.12589990684262e15 /* 2^50 */ +#define SEXP_MAX_ACCURATE_FLONUM_SQRT 1073741824.0 /* 2^30 */ sexp sexp_bignum_sqrt (sexp ctx, sexp a) { /* Babylonian method */ sexp_gc_var4(res, rem, tmp, tmpa); + if (! sexp_bignump(a)) return sexp_type_exception(ctx, NULL, SEXP_BIGNUM, a); sexp_gc_preserve4(ctx, res, rem, tmp, tmpa); /* initial estimate via flonum, ignoring signs */ if (sexp_negativep(a)) { - a = tmpa = sexp_copy_bignum(ctx, NULL, a, 0); + tmpa = sexp_copy_bignum(ctx, NULL, a, 0); + a = tmpa; sexp_negate(a); } res = sexp_make_flonum(ctx, sexp_bignum_to_double(a));