diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | complex.c | 8 | ||||
-rw-r--r-- | numeric.c | 6 | ||||
-rw-r--r-- | rational.c | 7 |
4 files changed, 28 insertions, 1 deletions
@@ -1,3 +1,11 @@ +Sun Jul 12 20:42:58 2009 Tadayoshi Funaba <tadf@dotrb.org> + + * numeric.c (fix_divide): added an entry to rational. + + * rational.c (rb_rational_reciprocal): added. + + * complex.c (f_reciprocal): added. + Sun Jul 12 02:24:42 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> * random.c (rand_init): use fixed buffer for small numbers. @@ -812,6 +812,12 @@ rb_fexpt(VALUE x, VALUE y) return m_exp(f_mul(m_log(x), y)); } +inline static VALUE +f_reciprocal(VALUE x) +{ + return f_quo(ONE, x); +} + /* * call-seq: * cmp ** numeric -> complex @@ -879,7 +885,7 @@ nucomp_expt(VALUE self, VALUE other) } return z; } - return f_expt(f_div(f_to_r(ONE), self), f_negate(other)); + return f_expt(f_reciprocal(self), f_negate(other)); } if (k_numeric_p(other) && f_real_p(other)) { VALUE r, theta; @@ -2268,6 +2268,8 @@ fix_fdiv(VALUE x, VALUE y) } } +VALUE rb_rational_reciprocal(VALUE x); + static VALUE fix_divide(VALUE x, VALUE y, ID op) { @@ -2295,6 +2297,10 @@ fix_divide(VALUE x, VALUE y, ID op) return rb_dbl2big(floor(div)); } } + case T_RATIONAL: + if (op == '/' && FIX2LONG(x) == 1) + return rb_rational_reciprocal(y); + return rb_funcall(rb_rational_new1(x), op, 1, y); default: return rb_num_coerce_bin(x, y, op); } diff --git a/rational.c b/rational.c index 50c4c86e75..632dc90117 100644 --- a/rational.c +++ b/rational.c @@ -1428,6 +1428,13 @@ nurat_marshal_load(VALUE self, VALUE a) /* --- */ +VALUE +rb_rational_reciprocal(VALUE x) +{ + get_dat1(x); + return f_rational_new_no_reduce2(CLASS_OF(x), dat->den, dat->num); +} + /* * call-seq: * int.gcd(int2) -> integer |