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

ruby-changes:42483

From: nobu <ko1@a...>
Date: Wed, 13 Apr 2016 13:15:25 +0900 (JST)
Subject: [ruby-changes:42483] nobu:r54557 (trunk): numeric.c: int_round_zero_p

nobu	2016-04-13 14:12:01 +0900 (Wed, 13 Apr 2016)

  New Revision: 54557

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=54557

  Log:
    numeric.c: int_round_zero_p
    
    * bignum.c (rb_big_size): add wrapper function of BIGSIZE and
      rename the method funtion with _m suffix.
    * numeric.c (int_round_zero_p): extracted from rb_int_round.
      optimize for Bignum, and convert VALUE returned by Numeric#size
      to long.

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/internal.h
    trunk/numeric.c
Index: numeric.c
===================================================================
--- numeric.c	(revision 54556)
+++ numeric.c	(revision 54557)
@@ -109,6 +109,7 @@ static VALUE fix_lshift(long, unsigned l https://github.com/ruby/ruby/blob/trunk/numeric.c#L109
 static VALUE fix_rshift(long, unsigned long);
 static VALUE int_pow(long x, unsigned long y);
 static VALUE int_cmp(VALUE x, VALUE y);
+static int int_round_zero_p(VALUE num, int ndigits);
 static VALUE flo_truncate(VALUE num);
 static int float_invariant_round(double number, int ndigits, VALUE *num);
 
@@ -1766,6 +1767,24 @@ flo_ceil(VALUE num) https://github.com/ruby/ruby/blob/trunk/numeric.c#L1767
     return dbl2ival(f);
 }
 
+static int
+int_round_zero_p(VALUE num, int ndigits)
+{
+    long bytes;
+    /* If 10**N / 2 > num, then return 0 */
+    /* We have log_256(10) > 0.415241 and log_256(1/2) = -0.125, so */
+    if (FIXNUM_P(num)) {
+	bytes = sizeof(long);
+    }
+    else if (RB_TYPE_P(num, T_BIGNUM)) {
+	bytes = rb_big_size(num);
+    }
+    else {
+	bytes = NUM2LONG(rb_funcall(num, idSize, 0));
+    }
+    return (-0.415241 * ndigits - 0.125 > bytes);
+}
+
 /*
  * Assumes num is an Integer, ndigits <= 0
  */
@@ -1773,11 +1792,8 @@ VALUE https://github.com/ruby/ruby/blob/trunk/numeric.c#L1792
 rb_int_round(VALUE num, int ndigits)
 {
     VALUE n, f, h, r;
-    long bytes;
-    /* If 10**N / 2 > num, then return 0 */
-    /* We have log_256(10) > 0.415241 and log_256(1/2) = -0.125, so */
-    bytes = FIXNUM_P(num) ? sizeof(long) : rb_funcall(num, idSize, 0);
-    if (-0.415241 * ndigits - 0.125 > bytes ) {
+
+    if (int_round_zero_p(num, ndigits)) {
 	return INT2FIX(0);
     }
 
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 54556)
+++ ChangeLog	(revision 54557)
@@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Apr 13 14:11:59 2016  Nobuyoshi Nakada  <nobu@r...>
+
+	* bignum.c (rb_big_size): add wrapper function of BIGSIZE and
+	  rename the method funtion with _m suffix.
+
+	* numeric.c (int_round_zero_p): extracted from rb_int_round.
+	  optimize for Bignum, and convert VALUE returned by Numeric#size
+	  to long.
+
 Wed Apr 13 12:00:08 2016  Koichi Sasada  <ko1@a...>
 
 	* test/ruby/test_basicinstructions.rb: add a test to check access
Index: internal.h
===================================================================
--- internal.h	(revision 54556)
+++ internal.h	(revision 54557)
@@ -780,6 +780,7 @@ VALUE rb_big_uminus(VALUE x); https://github.com/ruby/ruby/blob/trunk/internal.h#L780
 VALUE rb_big_hash(VALUE);
 VALUE rb_big_odd_p(VALUE);
 VALUE rb_big_even_p(VALUE);
+size_t rb_big_size(VALUE);
 VALUE rb_integer_float_cmp(VALUE x, VALUE y);
 VALUE rb_integer_float_eq(VALUE x, VALUE y);
 VALUE rb_cstr_parse_inum(const char *str, ssize_t len, char **endp, int base);
Index: bignum.c
===================================================================
--- bignum.c	(revision 54556)
+++ bignum.c	(revision 54557)
@@ -6906,6 +6906,12 @@ rb_big_abs(VALUE x) https://github.com/ruby/ruby/blob/trunk/bignum.c#L6906
     return x;
 }
 
+size_t
+rb_big_size(VALUE big)
+{
+    return BIGSIZE(big);
+}
+
 /*
  *  call-seq:
  *     big.size -> integer
@@ -6919,9 +6925,9 @@ rb_big_abs(VALUE x) https://github.com/ruby/ruby/blob/trunk/bignum.c#L6925
  */
 
 static VALUE
-rb_big_size(VALUE big)
+rb_big_size_m(VALUE big)
 {
-    return SIZET2NUM(BIGSIZE(big));
+    return SIZET2NUM(rb_big_size(big));
 }
 
 /*
@@ -7087,7 +7093,7 @@ Init_Bignum(void) https://github.com/ruby/ruby/blob/trunk/bignum.c#L7093
     rb_define_method(rb_cBignum, "===", rb_big_eq, 1);
     rb_define_method(rb_cBignum, "abs", rb_big_abs, 0);
     rb_define_method(rb_cBignum, "magnitude", rb_big_abs, 0);
-    rb_define_method(rb_cBignum, "size", rb_big_size, 0);
+    rb_define_method(rb_cBignum, "size", rb_big_size_m, 0);
     rb_define_method(rb_cBignum, "bit_length", rb_big_bit_length, 0);
 
 #ifdef USE_GMP

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

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