From fad7908a5de4ab08367914d53780ff6518d5f552 Mon Sep 17 00:00:00 2001 From: "S.H" Date: Tue, 9 Feb 2021 13:29:42 +0900 Subject: Improve performance Float#positive? and Float#negative? [Feature #17614] (#4160) --- benchmark/float_neg_posi.yml | 8 ++++++++ numeric.c | 30 ------------------------------ numeric.rb | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 benchmark/float_neg_posi.yml diff --git a/benchmark/float_neg_posi.yml b/benchmark/float_neg_posi.yml new file mode 100644 index 0000000000..172db1bf6d --- /dev/null +++ b/benchmark/float_neg_posi.yml @@ -0,0 +1,8 @@ +prelude: | + flo = 4.2 +benchmark: + negative?: | + flo.negative? + positive?: | + flo.positive? +loop_count: 20000000 diff --git a/numeric.c b/numeric.c index 97fc239211..bcc0ab7c61 100644 --- a/numeric.c +++ b/numeric.c @@ -2384,34 +2384,6 @@ flo_truncate(int argc, VALUE *argv, VALUE num) return flo_floor(argc, argv, num); } -/* - * call-seq: - * float.positive? -> true or false - * - * Returns +true+ if +float+ is greater than 0. - */ - -static VALUE -flo_positive_p(VALUE num) -{ - double f = RFLOAT_VALUE(num); - return f > 0.0 ? Qtrue : Qfalse; -} - -/* - * call-seq: - * float.negative? -> true or false - * - * Returns +true+ if +float+ is less than 0. - */ - -static VALUE -flo_negative_p(VALUE num) -{ - double f = RFLOAT_VALUE(num); - return f < 0.0 ? Qtrue : Qfalse; -} - /* * call-seq: * num.floor([ndigits]) -> integer or float @@ -5654,8 +5626,6 @@ Init_Numeric(void) rb_define_method(rb_cFloat, "finite?", rb_flo_is_finite_p, 0); rb_define_method(rb_cFloat, "next_float", flo_next_float, 0); rb_define_method(rb_cFloat, "prev_float", flo_prev_float, 0); - rb_define_method(rb_cFloat, "positive?", flo_positive_p, 0); - rb_define_method(rb_cFloat, "negative?", flo_negative_p, 0); } #undef rb_float_value diff --git a/numeric.rb b/numeric.rb index fbddaa9f6d..0746a83820 100644 --- a/numeric.rb +++ b/numeric.rb @@ -204,4 +204,26 @@ class Float Primitive.attr! 'inline' Primitive.cexpr! 'FLOAT_ZERO_P(self) ? Qtrue : Qfalse' end + + # + # call-seq: + # float.positive? -> true or false + # + # Returns +true+ if +float+ is greater than 0. + # + def positive? + Primitive.attr! 'inline' + Primitive.cexpr! 'RFLOAT_VALUE(self) > 0.0 ? Qtrue : Qfalse' + end + + # + # call-seq: + # float.negative? -> true or false + # + # Returns +true+ if +float+ is less than 0. + # + def negative? + Primitive.attr! 'inline' + Primitive.cexpr! 'RFLOAT_VALUE(self) < 0.0 ? Qtrue : Qfalse' + end end -- cgit v1.2.3