summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--complex.c5
-rw-r--r--test/ruby/test_complex.rb4
3 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 312c64fa13..efc060ebcc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon May 9 13:49:00 2011 Kenta Murata <mrkn@mrkn.jp>
+
+ * complex.c (string_to_c_internal): support scientific notation.
+ patched by Tinco Andringa. https://github.com/ruby/ruby/pull/16
+ [ruby-core:36046][Bug #4655]
+
Mon May 9 11:52:48 2011 NARUSE, Yui <naruse@ruby-lang.org>
* numeric.c (int_ord): remove K&R style.
diff --git a/complex.c b/complex.c
index 26bb6e9b1f..c2d15ed2b6 100644
--- a/complex.c
+++ b/complex.c
@@ -1498,6 +1498,7 @@ string_to_c_internal(VALUE self)
m = f_match(comp_pat2, s);
if (NIL_P(m))
return rb_assoc_new(Qnil, self);
+ /* string is of form "x+yi" */
sr = f_aref(m, INT2FIX(1));
if (NIL_P(f_aref(m, INT2FIX(2))))
si = Qnil;
@@ -1518,7 +1519,7 @@ string_to_c_internal(VALUE self)
if (!NIL_P(sr)) {
if (strchr(RSTRING_PTR(sr), '/'))
r = f_to_r(sr);
- else if (strchr(RSTRING_PTR(sr), '.'))
+ else if (strchr(RSTRING_PTR(sr), '.') || strchr(RSTRING_PTR(sr), 'e') || strchr(RSTRING_PTR(sr), 'E'))
r = f_to_f(sr);
else
r = f_to_i(sr);
@@ -1526,7 +1527,7 @@ string_to_c_internal(VALUE self)
if (!NIL_P(si)) {
if (strchr(RSTRING_PTR(si), '/'))
i = f_to_r(si);
- else if (strchr(RSTRING_PTR(si), '.'))
+ else if (strchr(RSTRING_PTR(si), '.') || strchr(RSTRING_PTR(si), 'e') || strchr(RSTRING_PTR(si), 'E'))
i = f_to_f(si);
else
i = f_to_i(si);
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb
index e364c97d9a..24083e1384 100644
--- a/test/ruby/test_complex.rb
+++ b/test/ruby/test_complex.rb
@@ -704,6 +704,10 @@ class Complex_Test < Test::Unit::TestCase
assert_equal(Complex(-0.33), '-0.33'.to_c)
assert_equal(Complex(-0.33), '-0.3_3'.to_c)
+ assert_equal(Complex(2, 2e4), '2+2e4i'.to_c)
+ assert_equal(Complex(2e3, 2), '2e3+2i'.to_c)
+ assert_equal(Complex(2e3, 2e4), '2e3+2e4i'.to_c)
+
assert_equal(Complex.polar(10,10), '10@10'.to_c)
assert_equal(Complex.polar(-10,-10), '-10@-10'.to_c)
assert_equal(Complex.polar(10.5,10.5), '10.5@10.5'.to_c)