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

ruby-changes:2543

From: ko1@a...
Date: 28 Nov 2007 02:42:30 +0900
Subject: [ruby-changes:2543] nobu - Ruby:r14034 (trunk): * bignum.c (big2str_find_n1): removed extraneous element.

nobu	2007-11-28 02:42:12 +0900 (Wed, 28 Nov 2007)

  New Revision: 14034

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/sprintf.c

  Log:
    * bignum.c (big2str_find_n1): removed extraneous element.
      [ruby-dev:32351], [ruby-dev:32365]
    
    * bignum.c (big2str_find_n1): returns necessary digits now.
    
    * sprintf.c (remove_sign_bits): extends sign bit first.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14034&r2=14033
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=14034&r2=14033
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/sprintf.c?r1=14034&r2=14033

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14033)
+++ ChangeLog	(revision 14034)
@@ -1,3 +1,12 @@
+Wed Nov 28 02:42:10 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* bignum.c (big2str_find_n1): removed extraneous element.
+	  [ruby-dev:32351], [ruby-dev:32365]
+
+	* bignum.c (big2str_find_n1): returns necessary digits now.
+
+	* sprintf.c (remove_sign_bits): extends sign bit first.
+
 Tue Nov 27 15:53:43 2007  Koichi Sasada  <ko1@a...>
 
 	* compile.c (iseq_compile_each): "when *[],1" dumps core.
@@ -61,11 +70,6 @@
 
 	* test/drb/test_drb.rb (TestDRbEval): ignored.
 
-Mon Nov 26 18:38:00 2007  Yukihiro Matsumoto  <matz@r...>
-
-	* sprintf.c (rb_str_format): always trim preceding zeros.
-	  [ruby-dev:32351]
-
 Mon Nov 26 17:32:16 2007  Tanaka Akira  <akr@f...>
 
 	* re.c (Init_Regexp): new method Regexp#fixed_encoding?
Index: sprintf.c
===================================================================
--- sprintf.c	(revision 14033)
+++ sprintf.c	(revision 14034)
@@ -19,6 +19,8 @@
 #include <stdarg.h>
 
 #define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
+#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)
+#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n)))
 
 static void fmt_setup(char*,int,int,int,int);
 
@@ -35,7 +37,7 @@
 	}
     }
     else if (base == 8) {
-	if (*t == '3') t++;
+	*t |= EXTENDSIGN(3, strlen(t));
 	while (*t == '7') {
 	    t++;
 	}
@@ -662,7 +664,7 @@
 			    val = rb_big_clone(val);
 			    rb_big_2comp(val);
 			}
-			tmp1 = tmp = rb_big2str0(val, base, Qtrue);
+			tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val));
 			s = RSTRING_PTR(tmp);
 			if (*s == '-') {
 			    if (base == 10) {
@@ -695,7 +697,7 @@
 		if (*p == 'X') {
 		    char *pp = s;
 		    int c;
-		    while (c = (int)*pp) {
+		    while ((c = (int)(unsigned char)*pp) != 0) {
 			*pp = rb_enc_toupper(c, enc);
 			pp++;
 		    }
Index: bignum.c
===================================================================
--- bignum.c	(revision 14033)
+++ bignum.c	(revision 14034)
@@ -786,18 +786,18 @@
 big2str_find_n1(VALUE x, int base)
 {
     static const double log_2[] = {
-        1.0,              1.58496250072116, 2.0,
-        2.32192809488736, 2.584962500721,   2.58496250072116,
-        2.8073549220576,  3.0,              3.16992500144231,
-        3.32192809488736, 3.4594316186373,  3.58496250072116,
-        3.70043971814109, 3.8073549220576,  3.90689059560852,
-        4.0,              4.08746284125034, 4.16992500144231,
-        4.24792751344359, 4.32192809488736, 4.39231742277876,
-        4.4594316186373,  4.52356195605701, 4.58496250072116,
-        4.64385618977472, 4.70043971814109, 4.75488750216347,
-        4.8073549220576,  4.85798099512757, 4.90689059560852,
-        4.95419631038688, 5.0,              5.04439411935845,
-        5.08746284125034, 5.12928301694497, 5.16992500144231
+	1.0,              1.58496250072116, 2.0,
+	2.32192809488736, 2.58496250072116, 2.8073549220576,
+	3.0,              3.16992500144231, 3.32192809488736,
+	3.4594316186373,  3.58496250072116, 3.70043971814109,
+	3.8073549220576,  3.90689059560852, 4.0,
+	4.08746284125034, 4.16992500144231, 4.24792751344359,
+	4.32192809488736, 4.39231742277876, 4.4594316186373,
+	4.52356195605701, 4.58496250072116, 4.64385618977472,
+	4.70043971814109, 4.75488750216347, 4.8073549220576,
+	4.85798099512757, 4.90689059560852, 4.95419631038688,
+	5.0,              5.04439411935845, 5.08746284125034,
+	5.12928301694497, 5.16992500144231
     };
     long bits;
 
@@ -814,7 +814,7 @@
         bits = BITSPERDIG*RBIGNUM_LEN(x);
     }
 
-    return (long)ceil(bits/(2*log_2[base - 2]));
+    return (long)ceil(bits/log_2[base - 2]);
 }
 
 static long
@@ -898,7 +898,7 @@
 {
     int off;
     VALUE ss, xx;
-    long n1, len, hbase;
+    long n1, n2, len, hbase;
     char* ptr;
 
     if (FIXNUM_P(x)) {
@@ -911,8 +911,9 @@
     if (base < 2 && 36 < base)
         rb_raise(rb_eArgError, "illegal radix %d", base);
 
-    n1 = big2str_find_n1(x, base);
-    ss = rb_str_new(0, 2*n1 + 1); /* plus one for sign */
+    n2 = big2str_find_n1(x, base);
+    n1 = (n2 + 1) / 2;
+    ss = rb_str_new(0, n2 + 1); /* plus one for sign */
     ptr = RSTRING_PTR(ss);
     ptr[0] = RBIGNUM_SIGN(x) ? '+' : '-';
 
@@ -924,11 +925,11 @@
     xx = rb_big_clone(x);
     RBIGNUM_SET_SIGN(xx, 1);
     if (n1 <= KARATSUBA_DIGITS) {
-        len = off + big2str_orig(xx, base, ptr + off, 2*n1, hbase, trim);
+        len = off + big2str_orig(xx, base, ptr + off, n2, hbase, trim);
     }
     else {
         len = off + big2str_karatsuba(xx, base, ptr + off, n1,
-                                      2*n1, hbase, trim);
+                                      n2, hbase, trim);
     }
 
     ptr[len] = '\0';
@@ -2442,7 +2443,7 @@
 rb_big_odd_p(VALUE num)
 {
     if (BDIGITS(num)[0] & 1) {
-       return Qtrue;
+	return Qtrue;
     }
     return Qfalse;
 }
@@ -2458,7 +2459,7 @@
 rb_big_even_p(VALUE num)
 {
     if (BDIGITS(num)[0] & 1) {
-       return Qfalse;
+	return Qfalse;
     }
     return Qtrue;
 }

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

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