From 4d372569d874b10db980fe4bd10bf8cfee585a55 Mon Sep 17 00:00:00 2001 From: ocean Date: Fri, 7 May 2004 02:26:19 +0000 Subject: * util.c (ruby_strtod): 0.0000000000000000001 == 0.0 should be false. [ruby-talk:99318] [ruby-dev:23465] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ util.c | 48 +++++++++++++++++++++--------------------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index ceeab3f936..d4a4d2a003 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri May 7 11:25:53 Hirokazu Yamamoto + + * util.c (ruby_strtod): 0.0000000000000000001 == 0.0 should be false. + [ruby-talk:99318] [ruby-dev:23465] + Fri May 7 10:00:05 2004 Hidetoshi NAGAI * ext/tk/tkutil.c (get_eval_string_core): bug fix. [ruby-dev:23466] diff --git a/util.c b/util.c index 437632861e..d89e08de5c 100644 --- a/util.c +++ b/util.c @@ -744,9 +744,10 @@ ruby_strtod(string, endPtr) * unnecessary overflow on I alone). In this * case, fracExp is incremented one for each * dropped digit. */ - int mantSize; /* Number of digits in mantissa. */ - int decPt; /* Number of mantissa digits BEFORE decimal - * point. */ + int mantSize = 0; /* Number of digits in mantissa. */ + int decPt = FALSE; /* mantissa has decimal point. */ + const char *pMant; /* Temporarily holds location of mantissa + * in string. */ const char *pExp; /* Temporarily holds location of exponent * in string. */ @@ -770,28 +771,30 @@ ruby_strtod(string, endPtr) sign = FALSE; } - /* skip preceding zeros */ - if (*p == '0') { - while (*p == '0') - p++; - p--; - } - /* * Count the number of digits in the mantissa (including the decimal * point), and also locate the decimal point. */ - decPt = -1; - for (mantSize = 0; ; mantSize += 1) { - c = *p; + for ( ; c = *p; p += 1) { if (!ISDIGIT(c)) { - if ((c != '.') || (decPt >= 0)) { + if (c != '.' || decPt) { break; } - decPt = mantSize; + decPt = TRUE; + } + else { + if (decPt) { /* already in fractional part */ + fracExp -= 1; + } + if (mantSize) { /* already in mantissa */ + mantSize += 1; + } + else if (c != '0') { /* have entered mantissa */ + mantSize += 1; + pMant = p; + } } - p += 1; } /* @@ -802,20 +805,11 @@ ruby_strtod(string, endPtr) */ pExp = p; - p -= mantSize; - if (decPt < 0) { - decPt = mantSize; - } - else { - mantSize -= 1; /* One of the digits was the point. */ - } + p = pMant; /* valid if mantSize > 0 */ if (mantSize > 18) { - fracExp = decPt - 18; + fracExp += (mantSize - 18); mantSize = 18; } - else { - fracExp = decPt - mantSize; - } if (mantSize == 0) { fraction = 0.0; p = string; -- cgit v1.2.3