1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* util.c (ruby_strtod): should not convert string in the form of

"-I.FE-X" which both "I" and "F" are ommitted. [ruby-dev:23883]

* test/ruby/test_float.rb (test_strtod): add test for bug fix.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6625 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ocean 2004-07-14 03:32:20 +00:00
parent b956b4a450
commit b9bfdbb13e
3 changed files with 40 additions and 9 deletions

View file

@ -1,3 +1,10 @@
Wed Jul 14 12:20:05 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* util.c (ruby_strtod): should not convert string in the form of
"-I.FE-X" which both "I" and "F" are ommitted. [ruby-dev:23883]
* test/ruby/test_float.rb (test_strtod): add test for bug fix.
Wed Jul 14 01:20:21 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* array.c: rdoc patch - unified margin.

View file

@ -61,12 +61,29 @@ class TestFloat < Test::Unit::TestCase
assert(a.abs < Float::EPSILON)
a = Float("-0.0")
assert(a.abs < Float::EPSILON)
a = Float("0." + "00" * Float::DIG + "1")
a = Float("0.0000000000000000001")
assert(a != 0.0)
a = Float("+0." + "00" * Float::DIG + "1")
a = Float("+0.0000000000000000001")
assert(a != 0.0)
a = Float("-0." + "00" * Float::DIG + "1")
a = Float("-0.0000000000000000001")
assert(a != 0.0)
a = Float(".0")
assert(a.abs < Float::EPSILON)
a = Float("+.0")
assert(a.abs < Float::EPSILON)
a = Float("-.0")
assert(a.abs < Float::EPSILON)
a = Float("0.")
assert(a.abs < Float::EPSILON)
a = Float("+0.")
assert(a.abs < Float::EPSILON)
a = Float("-0.")
assert(a.abs < Float::EPSILON)
assert_raise(ArgumentError){Float(".")}
assert_raise(ArgumentError){Float("+")}
assert_raise(ArgumentError){Float("+.")}
assert_raise(ArgumentError){Float("-")}
assert_raise(ArgumentError){Float("-.")}
# add expected behaviour here.
end
end

19
util.c
View file

@ -722,7 +722,8 @@ ruby_strtod(string, endPtr)
* fractional part of the mantissa, and X
* is the exponent. Either of the signs
* may be "+", "-", or omitted. Either I
* or F may be omitted, or both. The decimal
* or F may be omitted, but both cannot be
* ommitted at once. The decimal
* point isn't necessary unless F is present.
* The "E" may actually be an "e". E and X
* may both be omitted (but not just one).
@ -745,7 +746,8 @@ ruby_strtod(string, endPtr)
* case, fracExp is incremented one for each
* dropped digit. */
int mantSize = 0; /* Number of digits in mantissa. */
int decPt = FALSE; /* mantissa has decimal point. */
int hasPoint = FALSE; /* Decimal point exists. */
int hasDigit = FALSE; /* I or F exists. */
const char *pMant; /* Temporarily holds location of mantissa
* in string. */
const char *pExp; /* Temporarily holds location of exponent
@ -778,13 +780,13 @@ ruby_strtod(string, endPtr)
for ( ; c = *p; p += 1) {
if (!ISDIGIT(c)) {
if (c != '.' || decPt) {
if (c != '.' || hasPoint) {
break;
}
decPt = TRUE;
hasPoint = TRUE;
}
else {
if (decPt) { /* already in fractional part */
if (hasPoint) { /* already in fractional part */
fracExp -= 1;
}
if (mantSize) { /* already in mantissa */
@ -794,6 +796,7 @@ ruby_strtod(string, endPtr)
mantSize += 1;
pMant = p;
}
hasDigit = TRUE;
}
}
@ -812,7 +815,11 @@ ruby_strtod(string, endPtr)
fracExp += (mantSize - 18);
mantSize = 18;
}
{
if (!hasDigit) {
fraction = 0.0;
p = string;
}
else {
int frac1, frac2;
frac1 = 0;
for ( ; mantSize > 9; mantSize -= 1) {