[前][次][番号順一覧][スレッド一覧]

ruby-changes:24352

From: akr <ko1@a...>
Date: Mon, 16 Jul 2012 17:44:49 +0900 (JST)
Subject: [ruby-changes:24352] akr:r36403 (trunk): * bignum.c (rb_big_float_cmp): support fixnum for argument x.

akr	2012-07-16 17:44:32 +0900 (Mon, 16 Jul 2012)

  New Revision: 36403

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36403

  Log:
    * bignum.c (rb_big_float_cmp): support fixnum for argument x.
    
    * numeric.c (fix_equal): use rb_big_float_cmp.
      (fix_cmp): ditto.
      (fix_gt): ditto.
      (fix_ge): ditto.
      (fix_lt): ditto.
      (fix_le): ditto.
      (flo_eq): ditto.
      (flo_cmp): use rb_big_float_cmp for fixnum argument.
      (flo_gt): ditto.
      (flo_ge): ditto.
      (flo_lt): ditto.
      (flo_le): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/numeric.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36402)
+++ ChangeLog	(revision 36403)
@@ -1,3 +1,20 @@
+Mon Jul 16 17:29:45 2012  Tanaka Akira  <akr@f...>
+
+	* bignum.c (rb_big_float_cmp): support fixnum for argument x.
+
+	* numeric.c (fix_equal): use rb_big_float_cmp.
+	  (fix_cmp): ditto.
+	  (fix_gt): ditto.
+	  (fix_ge): ditto.
+	  (fix_lt): ditto.
+	  (fix_le): ditto.
+	  (flo_eq): ditto.
+	  (flo_cmp): use rb_big_float_cmp for fixnum argument.
+	  (flo_gt): ditto.
+	  (flo_ge): ditto.
+	  (flo_lt): ditto.
+	  (flo_le): ditto.
+
 Mon Jul 16 17:05:53 2012  Ayumu AIZAWA  <ayumu.aizawa@g...>
 
 	* test/fileutils/test_fileutils.rb: add test for FileUtils#uptodate?
Index: numeric.c
===================================================================
--- numeric.c	(revision 36402)
+++ numeric.c	(revision 36403)
@@ -1054,11 +1054,8 @@
 
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
       case T_BIGNUM:
-	b = rb_big2dbl(y);
-	break;
+        return rb_big_float_cmp(y, x) == INT2FIX(0) ? Qtrue : Qfalse;
       case T_FLOAT:
 	b = RFLOAT_VALUE(y);
 #if defined(_MSC_VER) && _MSC_VER < 1300
@@ -1124,9 +1121,6 @@
     if (isnan(a)) return Qnil;
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
-
       case T_BIGNUM:
       {
         VALUE rel = rb_big_float_cmp(y, x);
@@ -1169,9 +1163,6 @@
     a = RFLOAT_VALUE(x);
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
-
       case T_BIGNUM:
       {
         VALUE rel = rb_big_float_cmp(y, x);
@@ -1212,9 +1203,6 @@
     a = RFLOAT_VALUE(x);
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
-
       case T_BIGNUM:
       {
         VALUE rel = rb_big_float_cmp(y, x);
@@ -1254,9 +1242,6 @@
     a = RFLOAT_VALUE(x);
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
-
       case T_BIGNUM:
       {
         VALUE rel = rb_big_float_cmp(y, x);
@@ -1297,9 +1282,6 @@
     a = RFLOAT_VALUE(x);
     switch (TYPE(y)) {
       case T_FIXNUM:
-	b = (double)FIX2LONG(y);
-	break;
-
       case T_BIGNUM:
       {
         VALUE rel = rb_big_float_cmp(y, x);
@@ -2965,7 +2947,7 @@
       case T_BIGNUM:
 	return rb_big_eq(y, x);
       case T_FLOAT:
-	return (double)FIX2LONG(x) == RFLOAT_VALUE(y) ? Qtrue : Qfalse;
+        return rb_big_float_cmp(x, y) == INT2FIX(0) ? Qtrue : Qfalse;
       default:
 	return num_equal(x, y);
     }
@@ -2993,7 +2975,7 @@
       case T_BIGNUM:
 	return rb_big_cmp(rb_int2big(FIX2LONG(x)), y);
       case T_FLOAT:
-	return rb_dbl_cmp((double)FIX2LONG(x), RFLOAT_VALUE(y));
+        return rb_big_float_cmp(x, y);
       default:
 	return rb_num_coerce_cmp(x, y, rb_intern("<=>"));
     }
@@ -3018,7 +3000,7 @@
       case T_BIGNUM:
 	return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) > 0 ? Qtrue : Qfalse;
       case T_FLOAT:
-	return (double)FIX2LONG(x) > RFLOAT_VALUE(y) ? Qtrue : Qfalse;
+        return rb_big_float_cmp(x, y) == INT2FIX(1) ? Qtrue : Qfalse;
       default:
 	return rb_num_coerce_relop(x, y, '>');
     }
@@ -3043,7 +3025,10 @@
       case T_BIGNUM:
 	return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) >= 0 ? Qtrue : Qfalse;
       case T_FLOAT:
-	return (double)FIX2LONG(x) >= RFLOAT_VALUE(y) ? Qtrue : Qfalse;
+        {
+          VALUE rel = rb_big_float_cmp(x, y);
+          return rel == INT2FIX(1) || rel == INT2FIX(0) ? Qtrue : Qfalse;
+        }
       default:
 	return rb_num_coerce_relop(x, y, rb_intern(">="));
     }
@@ -3068,7 +3053,7 @@
       case T_BIGNUM:
 	return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) < 0 ? Qtrue : Qfalse;
       case T_FLOAT:
-	return (double)FIX2LONG(x) < RFLOAT_VALUE(y) ? Qtrue : Qfalse;
+        return rb_big_float_cmp(x, y) == INT2FIX(-1) ? Qtrue : Qfalse;
       default:
 	return rb_num_coerce_relop(x, y, '<');
     }
@@ -3093,7 +3078,10 @@
       case T_BIGNUM:
 	return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) <= 0 ? Qtrue : Qfalse;
       case T_FLOAT:
-	return (double)FIX2LONG(x) <= RFLOAT_VALUE(y) ? Qtrue : Qfalse;
+        {
+          VALUE rel = rb_big_float_cmp(x, y);
+          return rel == INT2FIX(-1) || rel == INT2FIX(0) ? Qtrue : Qfalse;
+        }
       default:
 	return rb_num_coerce_relop(x, y, rb_intern("<="));
     }
Index: bignum.c
===================================================================
--- bignum.c	(revision 36402)
+++ bignum.c	(revision 36403)
@@ -1436,10 +1436,20 @@
 {
     double a = RFLOAT_VALUE(y);
 
+    if (isnan(a))
+        return Qnil;
     if (isinf(a)) {
         if (a > 0.0) return INT2FIX(-1);
         else return INT2FIX(1);
     }
+    if (FIXNUM_P(x)) {
+        double xd = (double)FIX2LONG(x);
+        if (xd < a)
+            return INT2FIX(-1);
+        if (xd > a)
+            return INT2FIX(1);
+        return INT2FIX(0);
+    }
     return rb_dbl_cmp(rb_big2dbl(x), a);
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]