summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--bignum.c10
-rw-r--r--numeric.c4
-rw-r--r--test/ruby/test_float.rb5
4 files changed, 25 insertions, 1 deletions
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 <matz@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* 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 }