diff options
-rw-r--r-- | complex.c | 28 | ||||
-rw-r--r-- | numeric.c | 6 | ||||
-rw-r--r-- | test/ruby/test_complex.rb | 3 |
3 files changed, 25 insertions, 12 deletions
@@ -237,6 +237,22 @@ f_zero_p(VALUE x) #define f_nonzero_p(x) (!f_zero_p(x)) +VALUE rb_flo_is_finite_p(VALUE num); +inline static int +f_finite_p(VALUE x) +{ + if (RB_INTEGER_TYPE_P(x)) { + return TRUE; + } + else if (RB_FLOAT_TYPE_P(x)) { + return (int)rb_flo_is_finite_p(x); + } + else if (RB_TYPE_P(x, T_RATIONAL)) { + return TRUE; + } + return RTEST(rb_funcallv(x, id_finite_p, 0, 0)); +} + inline static int f_kind_of_p(VALUE x, VALUE c) { @@ -1326,18 +1342,12 @@ nucomp_inspect(VALUE self) static VALUE rb_complex_finite_p(VALUE self) { - VALUE magnitude = nucomp_abs(self); + get_dat1(self); - if (FINITE_TYPE_P(magnitude)) { + if (f_finite_p(dat->real) && f_finite_p(dat->imag)) { return Qtrue; } - else if (RB_FLOAT_TYPE_P(magnitude)) { - const double f = RFLOAT_VALUE(magnitude); - return isinf(f) ? Qfalse : Qtrue; - } - else { - return rb_funcall(magnitude, id_finite_p, 0); - } + return Qfalse; } /* @@ -1763,8 +1763,8 @@ flo_is_infinite_p(VALUE num) * i.e. it is not infinite and Float#nan? is +false+. */ -static VALUE -flo_is_finite_p(VALUE num) +VALUE +rb_flo_is_finite_p(VALUE num) { double value = RFLOAT_VALUE(num); @@ -5592,7 +5592,7 @@ Init_Numeric(void) rb_define_method(rb_cFloat, "nan?", flo_is_nan_p, 0); rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0); - rb_define_method(rb_cFloat, "finite?", 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, "prev_float", flo_prev_float, 0); rb_define_method(rb_cFloat, "positive?", flo_positive_p, 0); diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb index 5707047338..6a67f84bf5 100644 --- a/test/ruby/test_complex.rb +++ b/test/ruby/test_complex.rb @@ -832,6 +832,9 @@ class Complex_Test < Test::Unit::TestCase assert_predicate(-1-1i, :finite?) assert_not_predicate(Float::INFINITY + 1i, :finite?) assert_not_predicate(Complex(1, Float::INFINITY), :finite?) + assert_predicate(Complex(Float::MAX, 0.0), :finite?) + assert_predicate(Complex(0.0, Float::MAX), :finite?) + assert_predicate(Complex(Float::MAX, Float::MAX), :finite?) end def test_infinite_p |