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