summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/string.c9
-rw-r--r--test/t/string.rb4
2 files changed, 12 insertions, 1 deletions
diff --git a/src/string.c b/src/string.c
index 0049fdd5b..ce27cdaa1 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2868,7 +2868,11 @@ mrb_float_read(const char *string, char **endPtr)
mantSize -= 1; /* One of the digits was the point. */
}
if (mantSize > 18) {
- fracExp = decPt - 18;
+ if (decPt - 18 > 29999) {
+ fracExp = 29999;
+ } else {
+ fracExp = decPt - 18;
+ }
mantSize = 18;
} else {
fracExp = decPt - mantSize;
@@ -2922,6 +2926,9 @@ mrb_float_read(const char *string, char **endPtr)
}
while (isdigit(*p)) {
exp = exp * 10 + (*p - '0');
+ if (exp > 19999) {
+ exp = 19999;
+ }
p += 1;
}
}
diff --git a/test/t/string.rb b/test/t/string.rb
index 80fcbe6fa..20dc49d92 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -596,10 +596,14 @@ assert('String#to_f', '15.2.10.5.38') do
a = ''.to_f
b = '123456789'.to_f
c = '12345.6789'.to_f
+ d = '1e-2147483648'.to_f
+ e = '1e2147483648'.to_f
assert_float(0.0, a)
assert_float(123456789.0, b)
assert_float(12345.6789, c)
+ assert_float(0, d)
+ assert_float(Float::INFINITY, e)
end
assert('String#to_i', '15.2.10.5.39') do