diff --git a/benchmark/numeric_methods.yml b/benchmark/numeric_methods.yml
new file mode 100644
index 0000000000..433c2268a3
--- /dev/null
+++ b/benchmark/numeric_methods.yml
@@ -0,0 +1,13 @@
+prelude: |
+ int = 42
+ flo = 4.2
+benchmark:
+ real?: |
+ int.real?
+ integer?: |
+ flo.integer?
+ finite?: |
+ int.finite?
+ infinite?: |
+ int.infinite?
+loop_count: 20000000
diff --git a/numeric.c b/numeric.c
index bcc0ab7c61..167eed6068 100644
--- a/numeric.c
+++ b/numeric.c
@@ -710,35 +710,6 @@ num_divmod(VALUE x, VALUE y)
return rb_assoc_new(num_div(x, y), num_modulo(x, y));
}
-/*
- * call-seq:
- * num.real? -> true or false
- *
- * Returns +true+ if +num+ is a real number (i.e. not Complex).
- */
-
-static VALUE
-num_real_p(VALUE num)
-{
- return Qtrue;
-}
-
-/*
- * call-seq:
- * num.integer? -> true or false
- *
- * Returns +true+ if +num+ is an Integer.
- *
- * 1.0.integer? #=> false
- * 1.integer? #=> true
- */
-
-static VALUE
-num_int_p(VALUE num)
-{
- return Qfalse;
-}
-
/*
* call-seq:
* num.abs -> numeric
@@ -824,31 +795,6 @@ num_nonzero_p(VALUE num)
return num;
}
-/*
- * call-seq:
- * num.finite? -> true or false
- *
- * Returns +true+ if +num+ is a finite number, otherwise returns +false+.
- */
-static VALUE
-num_finite_p(VALUE num)
-{
- return Qtrue;
-}
-
-/*
- * call-seq:
- * num.infinite? -> -1, 1, or nil
- *
- * Returns +nil+, -1, or 1 depending on whether the value is
- * finite, -Infinity
, or +Infinity
.
- */
-static VALUE
-num_infinite_p(VALUE num)
-{
- return Qnil;
-}
-
/*
* call-seq:
* num.to_int -> integer
@@ -5430,12 +5376,8 @@ Init_Numeric(void)
rb_define_method(rb_cNumeric, "magnitude", num_abs, 0);
rb_define_method(rb_cNumeric, "to_int", num_to_int, 0);
- rb_define_method(rb_cNumeric, "real?", num_real_p, 0);
- rb_define_method(rb_cNumeric, "integer?", num_int_p, 0);
rb_define_method(rb_cNumeric, "zero?", num_zero_p, 0);
rb_define_method(rb_cNumeric, "nonzero?", num_nonzero_p, 0);
- rb_define_method(rb_cNumeric, "finite?", num_finite_p, 0);
- rb_define_method(rb_cNumeric, "infinite?", num_infinite_p, 0);
rb_define_method(rb_cNumeric, "floor", num_floor, -1);
rb_define_method(rb_cNumeric, "ceil", num_ceil, -1);
diff --git a/numeric.rb b/numeric.rb
index 0746a83820..0c191c01c0 100644
--- a/numeric.rb
+++ b/numeric.rb
@@ -1,3 +1,49 @@
+class Numeric
+ #
+ # call-seq:
+ # num.real? -> true or false
+ #
+ # Returns +true+ if +num+ is a real number (i.e. not Complex).
+ #
+ def real?
+ return true
+ end
+
+ #
+ # call-seq:
+ # num.integer? -> true or false
+ #
+ # Returns +true+ if +num+ is an Integer.
+ #
+ # 1.0.integer? #=> false
+ # 1.integer? #=> true
+ #
+ def integer?
+ return false
+ end
+
+ #
+ # call-seq:
+ # num.finite? -> true or false
+ #
+ # Returns +true+ if +num+ is a finite number, otherwise returns +false+.
+ #
+ def finite?
+ return true
+ end
+
+ #
+ # call-seq:
+ # num.infinite? -> -1, 1, or nil
+ #
+ # Returns +nil+, -1, or 1 depending on whether the value is
+ # finite, -Infinity
, or +Infinity
.
+ #
+ def infinite?
+ return nil
+ end
+end
+
class Integer
# call-seq:
# -int -> integer