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

ruby-changes:29038

From: akr <ko1@a...>
Date: Wed, 5 Jun 2013 21:17:45 +0900 (JST)
Subject: [ruby-changes:29038] akr:r41090 (trunk): * bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().

akr	2013-06-05 21:17:30 +0900 (Wed, 05 Jun 2013)

  New Revision: 41090

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

  Log:
    * bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().
      (bdigbitsize): Removed.

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 41089)
+++ ChangeLog	(revision 41090)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Jun  5 21:17:08 2013  Tanaka Akira  <akr@f...>
+
+	* bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().
+	  (bdigbitsize): Removed.
+
 Wed Jun  5 20:32:00 2013  Kenta Murata  <mrkn@c...>
 
 	* include/ruby/ruby.h: fix alignment in comment.
Index: bignum.c
===================================================================
--- bignum.c	(revision 41089)
+++ bignum.c	(revision 41090)
@@ -3050,27 +3050,6 @@ rb_big_divmod(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L3050
     return rb_assoc_new(bignorm(div), bignorm(mod));
 }
 
-static int
-bdigbitsize(BDIGIT x)
-{
-    int size = 1;
-    int nb = BITSPERDIG / 2;
-    BDIGIT bits = (~0 << nb);
-
-    if (!x) return 0;
-    while (x > 1) {
-	if (x & bits) {
-	    size += nb;
-	    x >>= nb;
-	}
-	x &= ~bits;
-	nb /= 2;
-	bits >>= nb;
-    }
-
-    return size;
-}
-
 static VALUE
 big_shift(VALUE x, long n)
 {
@@ -3090,9 +3069,8 @@ big_fdiv(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L3069
     int i;
 
     bigtrunc(x);
-    l = RBIGNUM_LEN(x) - 1;
-    ex = l * BITSPERDIG;
-    ex += bdigbitsize(BDIGITS(x)[l]);
+    l = RBIGNUM_LEN(x);
+    ex = l * BITSPERDIG - nlz(BDIGITS(x)[l-1]);
     ex -= 2 * DBL_BIGDIG * BITSPERDIG;
     if (ex) x = big_shift(x, ex);
 
@@ -3101,9 +3079,8 @@ big_fdiv(VALUE x, VALUE y) https://github.com/ruby/ruby/blob/trunk/bignum.c#L3079
 	y = rb_int2big(FIX2LONG(y));
       case T_BIGNUM:
 	bigtrunc(y);
-	l = RBIGNUM_LEN(y) - 1;
-	ey = l * BITSPERDIG;
-	ey += bdigbitsize(BDIGITS(y)[l]);
+	l = RBIGNUM_LEN(y);
+	ey = l * BITSPERDIG - nlz(BDIGITS(y)[l-1]);
 	ey -= DBL_BIGDIG * BITSPERDIG;
 	if (ey) y = big_shift(y, ey);
 	break;

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

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