diff options
author | tadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-21 01:30:25 +0000 |
---|---|---|
committer | tadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-21 01:30:25 +0000 |
commit | 72565402d9d0662a2fbef2e30f76b7a6621eefef (patch) | |
tree | f4a7af81718c24690caeeb7e87571c2d83f494eb /rational.c | |
parent | 280cbe0b1fb807ee0de9ea3e862d556763e08811 (diff) | |
download | ruby-72565402d9d0662a2fbef2e30f76b7a6621eefef.tar.gz |
* complex.c (nucomp_s_canonicalize_internal): checks exactness of
imag only.
* rational.c (nurat_s_convert): accepts non real value
(Rational(a,b) as a/b).
* complex.c (nucomp_s_convert): refined.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19442 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'rational.c')
-rw-r--r-- | rational.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/rational.c b/rational.c index 3ae00e8902..59c86d8899 100644 --- a/rational.c +++ b/rational.c @@ -1400,28 +1400,21 @@ string_to_r(VALUE self) static VALUE nurat_s_convert(int argc, VALUE *argv, VALUE klass) { + int c; VALUE a1, a2, backref; - rb_scan_args(argc, argv, "02", &a1, &a2); + c = rb_scan_args(argc, argv, "02", &a1, &a2); switch (TYPE(a1)) { case T_COMPLEX: - if (k_inexact_p(RCOMPLEX(a1)->imag) || !f_zero_p(RCOMPLEX(a1)->imag)) { - VALUE s = f_to_s(a1); - rb_raise(rb_eRangeError, "can't accept %s", - StringValuePtr(s)); - } - a1 = RCOMPLEX(a1)->real; + if (k_exact_p(RCOMPLEX(a1)->imag) && f_zero_p(RCOMPLEX(a1)->imag)) + a1 = RCOMPLEX(a1)->real; } switch (TYPE(a2)) { case T_COMPLEX: - if (k_inexact_p(RCOMPLEX(a2)->imag) || !f_zero_p(RCOMPLEX(a2)->imag)) { - VALUE s = f_to_s(a2); - rb_raise(rb_eRangeError, "can't accept %s", - StringValuePtr(s)); - } - a2 = RCOMPLEX(a2)->real; + if (k_exact_p(RCOMPLEX(a2)->imag) && f_zero_p(RCOMPLEX(a2)->imag)) + a2 = RCOMPLEX(a2)->real; } backref = rb_backref_get(); @@ -1455,14 +1448,18 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass) switch (TYPE(a1)) { case T_RATIONAL: - if (NIL_P(a2) || f_zero_p(a2)) + if (c == 1 || (k_exact_p(a2) && f_one_p(a2))) return a1; - return f_div(a1, a2); } - switch (TYPE(a2)) { - case T_RATIONAL: - return f_div(a1, a2); + if (c == 1) { + if (k_numeric_p(a1) && !f_integer_p(a1)) + return a1; + } + else { + if ((k_numeric_p(a1) && k_numeric_p(a2)) && + (!f_integer_p(a1) || !f_integer_p(a2))) + return f_div(a1, a2); } { |