diff options
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -2951,6 +2951,13 @@ fix_pow(VALUE x, VALUE y) if (FIXNUM_P(y)) { long b = FIX2LONG(y); + if (a == 1) return INT2FIX(1); + if (a == -1) { + if (b % 2 == 0) + return INT2FIX(1); + else + return INT2FIX(-1); + } if (b < 0) return rb_funcall(rb_rational_raw1(x), rb_intern("**"), 1, y); @@ -2960,27 +2967,18 @@ fix_pow(VALUE x, VALUE y) if (b > 0) return INT2FIX(0); return DBL2NUM(INFINITY); } - if (a == 1) return INT2FIX(1); - if (a == -1) { - if (b % 2 == 0) - return INT2FIX(1); - else - return INT2FIX(-1); - } return int_pow(a, b); } switch (TYPE(y)) { case T_BIGNUM: - - if (negative_int_p(y)) - return rb_funcall(rb_rational_raw1(x), rb_intern("**"), 1, y); - - if (a == 0) return INT2FIX(0); if (a == 1) return INT2FIX(1); if (a == -1) { if (int_even_p(y)) return INT2FIX(1); else return INT2FIX(-1); } + if (negative_int_p(y)) + return rb_funcall(rb_rational_raw1(x), rb_intern("**"), 1, y); + if (a == 0) return INT2FIX(0); x = rb_int2big(FIX2LONG(x)); return rb_big_pow(x, y); case T_FLOAT: |