diff options
author | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-07 02:26:19 +0000 |
---|---|---|
committer | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-07 02:26:19 +0000 |
commit | 4d372569d874b10db980fe4bd10bf8cfee585a55 (patch) | |
tree | 05a0b47d1761e289bbb0208bb9ace67c43be488c | |
parent | bb21d3d1f31060f66c57eec98182f686b8013b54 (diff) |
* 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
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | util.c | 48 |
2 files changed, 26 insertions, 27 deletions
@@ -1,3 +1,8 @@ +Fri May 7 11:25:53 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp> + + * 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 <nagai@ai.kyutech.ac.jp> * ext/tk/tkutil.c (get_eval_string_core): bug fix. [ruby-dev:23466] @@ -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; |