From 268432c51dae147cebc456aea8ca05842aa78c9a Mon Sep 17 00:00:00 2001 From: tadf Date: Sun, 28 Jun 2009 13:27:48 +0000 Subject: * complex.c (nucomp_expt): convert to a float when the given power is a bignum. * rational.c (nurat_expt): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23883 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ complex.c | 19 +++++++++++++++++-- rational.c | 3 ++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3af2e62431..194dff7ed1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun Jun 28 22:25:07 2009 Tadayoshi Funaba + + * complex.c (nucomp_expt): convert to a float when the given power + is a bignum. + + * rational.c (nurat_expt): ditto. + Sun Jun 28 21:16:48 2009 Tadayoshi Funaba * lib/cmath.rb (sqrt): fixed an issue [ruby-list:45852]. diff --git a/complex.c b/complex.c index 2a7e602ed1..3863e685c3 100644 --- a/complex.c +++ b/complex.c @@ -226,6 +226,18 @@ k_integer_p(VALUE x) return f_kind_of_p(x, rb_cInteger); } +inline static VALUE +k_fixnum_p(VALUE x) +{ + return f_kind_of_p(x, rb_cFixnum); +} + +inline static VALUE +k_bignum_p(VALUE x) +{ + return f_kind_of_p(x, rb_cBignum); +} + inline static VALUE k_float_p(VALUE x) { @@ -831,7 +843,7 @@ nucomp_expt(VALUE self, VALUE other) f_mul(dat->imag, m_log_bang(r))); return f_complex_polar(CLASS_OF(self), nr, ntheta); } - if (k_integer_p(other)) { + if (k_fixnum_p(other)) { if (f_gt_p(other, ZERO)) { VALUE x, z, n; @@ -862,9 +874,12 @@ nucomp_expt(VALUE self, VALUE other) if (k_numeric_p(other) && f_real_p(other)) { VALUE r, theta; + if (k_bignum_p(other)) + rb_warn("in a**b, b may be too big"); + r = f_abs(self); theta = f_arg(self); - return f_complex_polar(CLASS_OF(self), f_expt(r, other), + return f_complex_polar(CLASS_OF(self), rb_fexpt(r, other), f_mul(theta, other)); } return rb_num_coerce_bin(self, other, id_expt); diff --git a/rational.c b/rational.c index 90025fad21..8b28ac5ad1 100644 --- a/rational.c +++ b/rational.c @@ -902,7 +902,6 @@ nurat_expt(VALUE self, VALUE other) switch (TYPE(other)) { case T_FIXNUM: - case T_BIGNUM: { VALUE num, den; @@ -924,6 +923,8 @@ nurat_expt(VALUE self, VALUE other) } return f_rational_new2(CLASS_OF(self), num, den); } + case T_BIGNUM: + rb_warn("in a**b, b may be too big"); case T_FLOAT: case T_RATIONAL: return rb_fexpt(f_to_f(self), other); -- cgit v1.2.3