ruby-changes:12061
From: matz <ko1@a...>
Date: Thu, 18 Jun 2009 02:05:51 +0900 (JST)
Subject: [ruby-changes:12061] Ruby:r23730 (trunk): * numeric.c (flo_cmp): Infinity is greater than any bignum
matz 2009-06-18 02:05:31 +0900 (Thu, 18 Jun 2009) New Revision: 23730 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23730 Log: * numeric.c (flo_cmp): Infinity is greater than any bignum number. [ruby-dev:38672] * bignum.c (rb_big_cmp): ditto. Modified files: trunk/ChangeLog trunk/bignum.c trunk/numeric.c trunk/test/ruby/test_float.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 23729) +++ ChangeLog (revision 23730) @@ -1,3 +1,10 @@ +Thu Jun 18 01:35:51 2009 Yukihiro Matsumoto <matz@r...> + + * 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 <nobu@r...> * file.c (file_expand_path): drive letter is ascii only. Index: numeric.c =================================================================== --- numeric.c (revision 23729) +++ numeric.c (revision 23730) @@ -943,6 +943,10 @@ break; case T_BIGNUM: + if (isinf(a)) { + if (a > 0.0) return INT2FIX(1); + else return INT2FIX(-1); + } b = rb_big2dbl(y); break; Index: bignum.c =================================================================== --- bignum.c (revision 23729) +++ bignum.c (revision 23730) @@ -1280,8 +1280,16 @@ 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("<=>")); } Index: test/ruby/test_float.rb =================================================================== --- test/ruby/test_float.rb (revision 23729) +++ test/ruby/test_float.rb (revision 23730) @@ -215,6 +215,11 @@ 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 } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/