summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--util.c48
2 files changed, 26 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 010082f..4b7b50b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri May 7 11:17:27 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
+
+ * util.c (ruby_strtod): 0.0000000000000000001 == 0.0 should be false.
+ [ruby-talk:99318] [ruby-dev:23465]
+
Thu May 6 22:27:32 2004 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* ext/socket/socket.c (ippaddr): use NUMERICHOST if can not resolve
diff --git a/util.c b/util.c
index 13c4f87..56da0f5 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;