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

ruby-changes:24356

From: akr <ko1@a...>
Date: Mon, 16 Jul 2012 19:39:54 +0900 (JST)
Subject: [ruby-changes:24356] akr:r36407 (trunk): * bignum.c (rb_integer_float_eq): new function.

akr	2012-07-16 19:39:42 +0900 (Mon, 16 Jul 2012)

  New Revision: 36407

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

  Log:
    * bignum.c (rb_integer_float_eq): new function.
      (rb_big_eq): use rb_integer_float_eq.
    
    * internal.h (rb_integer_float_eq): declared.
    
    * numeric.c (flo_eq): use rb_integer_float_eq.
      (fix_equal): ditto.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36406)
+++ ChangeLog	(revision 36407)
@@ -1,3 +1,13 @@
+Mon Jul 16 19:24:01 2012  Tanaka Akira  <akr@f...>
+
+	* bignum.c (rb_integer_float_eq): new function.
+	  (rb_big_eq): use rb_integer_float_eq.
+
+	* internal.h (rb_integer_float_eq): declared.
+
+	* numeric.c (flo_eq): use rb_integer_float_eq.
+	  (fix_equal): ditto.
+
 Mon Jul 16 19:02:31 2012  Tanaka Akira  <akr@f...>
 
 	* bignum.c (rb_integer_float_cmp): rename a local variable.
Index: numeric.c
===================================================================
--- numeric.c	(revision 36406)
+++ numeric.c	(revision 36407)
@@ -1055,7 +1055,7 @@
     switch (TYPE(y)) {
       case T_FIXNUM:
       case T_BIGNUM:
-        return rb_integer_float_cmp(y, x) == INT2FIX(0) ? Qtrue : Qfalse;
+        return rb_integer_float_eq(y, x);
       case T_FLOAT:
 	b = RFLOAT_VALUE(y);
 #if defined(_MSC_VER) && _MSC_VER < 1300
@@ -2947,7 +2947,7 @@
       case T_BIGNUM:
 	return rb_big_eq(y, x);
       case T_FLOAT:
-        return rb_integer_float_cmp(x, y) == INT2FIX(0) ? Qtrue : Qfalse;
+        return rb_integer_float_eq(x, y);
       default:
 	return num_equal(x, y);
     }
Index: internal.h
===================================================================
--- internal.h	(revision 36406)
+++ internal.h	(revision 36407)
@@ -50,6 +50,7 @@
 VALUE rb_big_fdiv(VALUE x, VALUE y);
 VALUE rb_big_uminus(VALUE x);
 VALUE rb_integer_float_cmp(VALUE x, VALUE y);
+VALUE rb_integer_float_eq(VALUE x, VALUE y);
 
 /* class.c */
 VALUE rb_obj_methods(int argc, VALUE *argv, VALUE obj);
Index: bignum.c
===================================================================
--- bignum.c	(revision 36406)
+++ bignum.c	(revision 36407)
@@ -1481,6 +1481,38 @@
     return INT2FIX(-1);
 }
 
+VALUE
+rb_integer_float_eq(VALUE x, VALUE y)
+{
+    double yd = RFLOAT_VALUE(y);
+    double yi, yf;
+
+    if (isnan(yd) || isinf(yd))
+        return Qfalse;
+    yf = modf(yd, &yi);
+    if (yf != 0)
+        return Qfalse;
+    if (FIXNUM_P(x)) {
+#if SIZEOF_LONG * CHAR_BIT < DBL_MANT_DIG /* assume FLT_RADIX == 2 */
+        double xd = (double)FIX2LONG(x);
+        if (xd != yd)
+            return Qfalse;
+        return Qtrue;
+#else
+        long xl, yl;
+        if (yi < LONG_MIN || LONG_MAX < yi)
+            return Qfalse;
+        xl = FIX2LONG(x);
+        yl = (long)yi;
+        if (xl != yl)
+            return Qfalse;
+        return Qtrue;
+#endif
+    }
+    y = rb_dbl2big(yi);
+    return rb_big_eq(x, y);
+}
+
 /*
  *  call-seq:
  *     big <=> numeric   -> -1, 0, +1 or nil
@@ -1654,7 +1686,7 @@
       case T_BIGNUM:
 	break;
       case T_FLOAT:
-        return rb_integer_float_cmp(x, y) == INT2FIX(0) ? Qtrue : Qfalse;
+        return rb_integer_float_eq(x, y);
       default:
 	return rb_equal(y, x);
     }

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

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