From 3c1d5b89c33546028fce534546b8e356369ee231 Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 9 Jul 1998 08:40:46 +0000 Subject: 1.1b9_30 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@263 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- bignum.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index ec16c991ea..94d7095aca 100644 --- a/bignum.c +++ b/bignum.c @@ -917,7 +917,7 @@ big_pow(x, y) VALUE x, y; { double d; - VALUE z; + long yy; if (y == INT2FIX(0)) return INT2FIX(1); switch (TYPE(y)) { @@ -926,32 +926,34 @@ big_pow(x, y) break; case T_BIGNUM: - if (RBIGNUM(y)->sign) goto pos_big; + Warn("in a**b, b may be too big"); d = big2dbl(y); break; case T_FIXNUM: - if (FIX2LONG(y) > 0) goto pos_big; - d = (double)FIX2LONG(y); + yy = NUM2LONG(y); + if (yy > 0) { + VALUE z; + + z = x; + for (;;) { + yy = yy - 1; + if (yy == 0) break; + while (yy % 2 == 0) { + yy = yy / 2; + x = big_mul(x, x); + } + z = big_mul(z, x); + } + return z; + } + d = (double)yy; break; default: return num_coerce_bin(x, y); } return float_new(pow(big2dbl(x), d)); - - pos_big: - z = x; - for (;;) { - y = rb_funcall(y, '-', 1, INT2FIX(1)); - if (y == INT2FIX(0)) break; - while (rb_funcall(y, '%', 1, INT2FIX(2)) == INT2FIX(0)) { - y = rb_funcall(y, '/', 1, INT2FIX(2)); - x = big_mul(x, x); - } - z = big_mul(z, x); - } - return z; } VALUE -- cgit v1.2.3