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/