From b0e3b873f5d33a750cc4b04a20a9e6634ece1a47 Mon Sep 17 00:00:00 2001 From: h2so5 Date: Sat, 22 Feb 2014 16:50:52 +0900 Subject: preserve significands in float-string conversion --- src/numeric.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/numeric.c b/src/numeric.c index c17b9c251..a8c483148 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -143,8 +143,25 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) } exp = (n > 1) ? floor(log10(n)) : -ceil(-log10(n)); + + /* preserve significands */ + int length = 0; + if (exp < 0) { + int i, beg = -1, end = 0; + double f = n; + double fd = 0; + for (i = 0; i < FLO_MAX_DIGITS; ++i) { + f = (f - fd) * 10.0; + fd = floor(f + FLO_EPSILON); + if (fd != 0) { + if (beg < 0) beg = i; + end = i + 1; + } + } + if (beg >= 0) length = end - beg; + } - if ((exp < 0 ? -exp : exp) >= FLO_MAX_DIGITS) { + if (abs(exp) + length >= FLO_MAX_DIGITS) { /* exponent representation */ e = TRUE; n = n / pow(10.0, exp); -- cgit v1.2.3