summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--bignum.c5
2 files changed, 9 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f5a6c47359..e343da4221 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,12 @@ Sat Sep 6 07:24:49 2008 Tanaka Akira <akr@fsij.org>
* io.c (rb_io_extract_modeenc): raise an error for ASCII incompatible
encoding without binmode.
+Sat Sep 6 07:12:42 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * bignum.c (bigdivrem1): optimization by skipping zeros at the
+ tail of digits. a patch from TOYOFUKU Chikanobu
+ <nobu_toyofuku at nifty.com> in [ruby-dev:36169].
+
Sat Sep 6 06:28:46 2008 Tanaka Akira <akr@fsij.org>
* enc/trans/escape.trans: new file.
diff --git a/bignum.c b/bignum.c
index 6ebbfa0b70..08e7ebb215 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1633,19 +1633,20 @@ bigdivrem1(void *ptr)
{
struct big_div_struct *bds = (struct big_div_struct*)ptr;
long nx = bds->nx, ny = bds->ny;
- long i, j;
+ long i, j, nyzero;
BDIGIT *yds = bds->yds, *zds = bds->zds;
BDIGIT_DBL t2;
BDIGIT_DBL_SIGNED num;
BDIGIT q;
j = nx==ny?nx+1:nx;
+ for (nyzero = 0; !yds[nyzero]; nyzero++);
do {
if (bds->stop) return Qnil;
if (zds[j] == yds[ny-1]) q = BIGRAD-1;
else q = (BDIGIT)((BIGUP(zds[j]) + zds[j-1])/yds[ny-1]);
if (q) {
- i = 0; num = 0; t2 = 0;
+ i = nyzero; num = 0; t2 = 0;
do { /* multiply and subtract */
BDIGIT_DBL ee;
t2 += (BDIGIT_DBL)yds[i] * q;