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 /util.c | |
parent | bb21d3d1f31060f66c57eec98182f686b8013b54 (diff) | |
download | ruby-4d372569d874b10db980fe4bd10bf8cfee585a55.tar.gz |
* 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
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 48 |
1 files changed, 21 insertions, 27 deletions
@@ -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; |