diff options
author | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-16 04:25:35 +0000 |
---|---|---|
committer | mrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-16 04:25:35 +0000 |
commit | affa0f845cb0d81e0d4a693766cb5875462b467d (patch) | |
tree | 7f4bef580bb1699e43a180c484ceb823ebf33a6f /complex.c | |
parent | ab9b7890c287ac55e7e261cbab1ed1664d9b66a8 (diff) | |
download | ruby-affa0f845cb0d81e0d4a693766cb5875462b467d.tar.gz |
complex.c: optimize Numeric#polar and Numeric#arg
* complex.c (numeric_polar): optimize for Integer, Float, and Rational.
* complex.c (numeric_arg): directly create the value of pi.
* complex.c (f_negative_p): optimize for Integer, Float, and Rational.
* rational.c (INT_NEGATIVE_P): move the definition into internal.h.
* internal.h (INT_NEGATIVE_P): ditto.
* numeric.c (rb_float_abs): rename from flo_abs and export to be used
from other source files..
* internal.h (rb_float_abs): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56809 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'complex.c')
-rw-r--r-- | complex.c | 34 |
1 files changed, 29 insertions, 5 deletions
@@ -182,8 +182,12 @@ fun2(quo) inline static int f_negative_p(VALUE x) { - if (FIXNUM_P(x)) - return FIXNUM_NEGATIVE_P(x); + if (RB_INTEGER_TYPE_P(x)) + return INT_NEGATIVE_P(x); + else if (RB_FLOAT_TYPE_P(x)) + return RFLOAT_VALUE(x) < 0.0; + else if (RB_TYPE_P(x, T_RATIONAL)) + return INT_NEGATIVE_P(RRATIONAL(x)->num); return rb_num_negative_p(x); } @@ -2045,8 +2049,8 @@ static VALUE numeric_arg(VALUE self) { if (f_positive_p(self)) - return INT2FIX(0); - return rb_const_get(rb_mMath, id_PI); + return INT2FIX(0); + return DBL2NUM(M_PI); } /* @@ -2062,6 +2066,8 @@ numeric_rect(VALUE self) return rb_assoc_new(self, INT2FIX(0)); } +static VALUE float_arg(VALUE self); + /* * call-seq: * num.polar -> array @@ -2071,7 +2077,25 @@ numeric_rect(VALUE self) static VALUE numeric_polar(VALUE self) { - return rb_assoc_new(f_abs(self), f_arg(self)); + VALUE abs, arg; + + if (RB_INTEGER_TYPE_P(self)) { + abs = rb_int_abs(self); + arg = numeric_arg(self); + } + else if (RB_FLOAT_TYPE_P(self)) { + abs = rb_float_abs(self); + arg = float_arg(self); + } + else if (RB_TYPE_P(self, T_RATIONAL)) { + abs = rb_rational_abs(self); + arg = numeric_arg(self); + } + else { + abs = f_abs(self); + arg = f_arg(self); + } + return rb_assoc_new(abs, arg); } /* |