]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
1) Use _mpd_basedivmod() regardless of the length of the dividend. This is
authorStefan Krah <skrah@bytereef.org>
Wed, 22 Aug 2012 16:54:37 +0000 (18:54 +0200)
committerStefan Krah <skrah@bytereef.org>
Wed, 22 Aug 2012 16:54:37 +0000 (18:54 +0200)
   required for a corner case in dec_hash() in the following commit and also
   usually faster. dec_hash() needs some extra precision above MPD_MAX_PREC,
   and _mpd_base_ndivmod() is not audited for that.

2) Use _mpd_basemul() if the length of the smaller operand is less than
   or equal to 256. While this is technically an optimization, it is
   required for *testing* corner cases in dec_hash() in reasonable time.

Modules/_decimal/libmpdec/mpdecimal.c

index d7ae41cf48557b92582b596a93dd2ac0faf567e5..9bdb03de55759e2f47a49c9e0ab498cec1f293f1 100644 (file)
@@ -3513,8 +3513,7 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
     if (b->len == 1) {
         rem = _mpd_shortdiv(q->data, a->data, a->len, b->data[0]);
     }
-    else if (a->len < 2*MPD_NEWTONDIV_CUTOFF &&
-             b->len < MPD_NEWTONDIV_CUTOFF) {
+    else if (b->len <= MPD_NEWTONDIV_CUTOFF) {
         int ret = _mpd_basedivmod(q->data, NULL, a->data, b->data,
                                   a->len, b->len);
         if (ret < 0) {
@@ -3667,8 +3666,7 @@ _mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b,
             r->data[0] = _mpd_shortdiv(q->data, a->data, a->len, b->data[0]);
         }
     }
-    else if (a->len < 2*MPD_NEWTONDIV_CUTOFF &&
-             b->len < MPD_NEWTONDIV_CUTOFF) {
+    else if (b->len <= MPD_NEWTONDIV_CUTOFF) {
         int ret;
         ret = _mpd_basedivmod(q->data, r->data, a->data, b->data,
                               a->len, b->len);
@@ -5544,10 +5542,15 @@ _mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b,
     }
 
 
-    if (small->len == 1) {
+    if (small->len <= 256) {
         rdata = mpd_calloc(rsize, sizeof *rdata);
         if (rdata != NULL) {
-            _mpd_shortmul(rdata, big->data, big->len, small->data[0]);
+            if (small->len == 1) {
+                _mpd_shortmul(rdata, big->data, big->len, small->data[0]);
+            }
+            else {
+                _mpd_basemul(rdata, small->data, big->data, small->len, big->len);
+            }
         }
     }
     else if (rsize <= 1024) {