diff --git a/ChangeLog b/ChangeLog index a244e1c625..0af30b4672 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Jun 18 01:35:51 2009 Yukihiro Matsumoto + + * numeric.c (flo_cmp): Infinity is greater than any bignum + number. [ruby-dev:38672] + + * bignum.c (rb_big_cmp): ditto. + Thu Jun 18 01:29:16 2009 Nobuyoshi Nakada * file.c (file_expand_path): drive letter is ascii only. diff --git a/bignum.c b/bignum.c index cba4210946..bb6430c19d 100644 --- a/bignum.c +++ b/bignum.c @@ -1280,7 +1280,15 @@ rb_big_cmp(VALUE x, VALUE y) break; case T_FLOAT: - return rb_dbl_cmp(rb_big2dbl(x), RFLOAT_VALUE(y)); + { + double a = RFLOAT_VALUE(y); + + if (isinf(a)) { + if (a > 0.0) return INT2FIX(-1); + else return INT2FIX(1); + } + return rb_dbl_cmp(rb_big2dbl(x), a); + } default: return rb_num_coerce_cmp(x, y, rb_intern("<=>")); diff --git a/numeric.c b/numeric.c index a4ccd01b5b..74061fc690 100644 --- a/numeric.c +++ b/numeric.c @@ -943,6 +943,10 @@ flo_cmp(VALUE x, VALUE y) break; case T_BIGNUM: + if (isinf(a)) { + if (a > 0.0) return INT2FIX(1); + else return INT2FIX(-1); + } b = rb_big2dbl(y); break; diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb index 96fd354aba..15e17ad92a 100644 --- a/test/ruby/test_float.rb +++ b/test/ruby/test_float.rb @@ -215,6 +215,11 @@ class TestFloat < Test::Unit::TestCase assert_equal(-1, 1.0 <=> 2**32) + assert_equal(1, inf <=> (Float::MAX.to_i*2)) + assert_equal(-1, -inf <=> (-Float::MAX.to_i*2)) + assert_equal(-1, (Float::MAX.to_i*2) <=> inf) + assert_equal(1, (-Float::MAX.to_i*2) <=> -inf) + assert_raise(ArgumentError) { 1.0 > nil } assert_raise(ArgumentError) { 1.0 >= nil } assert_raise(ArgumentError) { 1.0 < nil }