diff options
author | tadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-06-28 13:27:48 +0000 |
---|---|---|
committer | tadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-06-28 13:27:48 +0000 |
commit | 268432c51dae147cebc456aea8ca05842aa78c9a (patch) | |
tree | de8fff4d6490579ace7f2d1092ad08970c5b64ae /complex.c | |
parent | faea8893f82230eb0e2c5759361138fa20af7a9a (diff) | |
download | ruby-268432c51dae147cebc456aea8ca05842aa78c9a.tar.gz |
* 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
Diffstat (limited to 'complex.c')
-rw-r--r-- | complex.c | 19 |
1 files changed, 17 insertions, 2 deletions
@@ -227,6 +227,18 @@ k_integer_p(VALUE x) } 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) { return f_kind_of_p(x, rb_cFloat); @@ -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); |