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/