diff --git a/ChangeLog b/ChangeLog index 315924a271..546fad954b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sun Jul 12 20:42:58 2009 Tadayoshi Funaba + + * 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 * random.c (rand_init): use fixed buffer for small numbers. diff --git a/complex.c b/complex.c index 9d9e90c02e..f8c0ecd1c2 100644 --- a/complex.c +++ b/complex.c @@ -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; diff --git a/numeric.c b/numeric.c index 5846610c71..53da949609 100644 --- a/numeric.c +++ b/numeric.c @@ -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