diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | bignum.c | 10 | ||||
-rw-r--r-- | numeric.c | 4 | ||||
-rw-r--r-- | test/ruby/test_float.rb | 27 |
4 files changed, 47 insertions, 1 deletions
@@ -1,3 +1,10 @@ +Mon Oct 17 04:19:39 2011 Yukihiro Matsumoto <matz@ruby-lang.org> + + * numeric.c (flo_cmp): Infinity is greater than any bignum + number. [ruby-dev:38672] + + * bignum.c (rb_big_cmp): ditto. + Mon Oct 17 03:56:12 2011 Yusuke Endoh <mame@tsg.ne.jp> * ext/openssl/ossl_x509store.c (ossl_x509store_initialize): initialize @@ -1114,7 +1114,15 @@ rb_big_cmp(x, y) break; case T_FLOAT: - return rb_dbl_cmp(rb_big2dbl(x), RFLOAT(y)->value); + { + 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); @@ -936,6 +936,10 @@ flo_cmp(x, 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 cbc6a7886b..b6e643da1f 100644 --- a/test/ruby/test_float.rb +++ b/test/ruby/test_float.rb @@ -144,4 +144,31 @@ class TestFloat < Test::Unit::TestCase assert_operator((-4611686018427387905.0).to_i, :<, 0) assert_operator((-4611686018427387906.0).to_i, :<, 0) end + + def test_cmp + inf = 1.0 / 0.0 + nan = inf / inf + assert_equal(0, 1.0 <=> 1.0) + assert_equal(1, 1.0 <=> 0.0) + assert_equal(-1, 1.0 <=> 2.0) + assert_nil(1.0 <=> nil) + assert_nil(1.0 <=> nan) + assert_nil(nan <=> 1.0) + + assert_equal(0, 1.0 <=> 1) + assert_equal(1, 1.0 <=> 0) + assert_equal(-1, 1.0 <=> 2) + + 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 } + assert_raise(ArgumentError) { 1.0 <= nil } + end end |