From ce7487182ace6aa079f4587f477dcbb4dad32e4e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 22 Nov 2015 09:08:22 -0700 Subject: [PATCH] fix too-early exact->inexact conversion in number parsing Robby found this bug, continuing his streak that included find the bugs behind commits f5dbd99e43 and 901ffdcbac. --- pkgs/racket-test-core/tests/racket/numstrs.rktl | 3 +++ racket/src/racket/src/numstr.c | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/numstrs.rktl b/pkgs/racket-test-core/tests/racket/numstrs.rktl index e6d7afb2dd..061229bf23 100644 --- a/pkgs/racket-test-core/tests/racket/numstrs.rktl +++ b/pkgs/racket-test-core/tests/racket/numstrs.rktl @@ -54,6 +54,9 @@ (1e-134 "0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001") (-0.0 "-632.3206524753840966914228247597079196012717570277972845484e-399") + (1e-300 + ;; check e->i only after division is performed + "#i500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") (10.0 "1#") (10.0 "1#e0") (10.0 "1####e-3") diff --git a/racket/src/racket/src/numstr.c b/racket/src/racket/src/numstr.c index ac7b837b45..c0fe380ea7 100644 --- a/racket/src/racket/src/numstr.c +++ b/racket/src/racket/src/numstr.c @@ -1582,7 +1582,8 @@ Scheme_Object *scheme_read_number(const mzchar *str, intptr_t len, first[has_slash - delta] = 0; n1 = scheme_read_number(first, has_slash - delta, - is_float, is_not_float, 1, + /* recur without is_float to keep all precision */ + 0, is_not_float, 1, radix, 1, next_complain, div_by_zero, test_only, @@ -1606,7 +1607,8 @@ Scheme_Object *scheme_read_number(const mzchar *str, intptr_t len, #endif n2 = scheme_read_number(substr, len - has_slash - 1, - is_float, is_not_float, 1, + /* recur without is_float to keep all precision */ + 0, is_not_float, 1, radix, 1, next_complain, div_by_zero, test_only,