Improve performance Float#positive? and Float#negative? [Feature #17614] (#4160)

This commit is contained in:
S.H 2021-02-09 13:29:42 +09:00 коммит произвёл GitHub
Родитель 97cf290063
Коммит fad7908a5d
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 30 добавлений и 30 удалений

Просмотреть файл

@ -0,0 +1,8 @@
prelude: |
flo = 4.2
benchmark:
negative?: |
flo.negative?
positive?: |
flo.positive?
loop_count: 20000000

Просмотреть файл

@ -2384,34 +2384,6 @@ flo_truncate(int argc, VALUE *argv, VALUE num)
return flo_floor(argc, argv, 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: * call-seq:
* num.floor([ndigits]) -> integer or float * 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, "finite?", rb_flo_is_finite_p, 0);
rb_define_method(rb_cFloat, "next_float", flo_next_float, 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, "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 #undef rb_float_value

Просмотреть файл

@ -204,4 +204,26 @@ class Float
Primitive.attr! 'inline' Primitive.attr! 'inline'
Primitive.cexpr! 'FLOAT_ZERO_P(self) ? Qtrue : Qfalse' Primitive.cexpr! 'FLOAT_ZERO_P(self) ? Qtrue : Qfalse'
end 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 end