diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-06-06 13:50:50 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-06 13:50:50 (GMT) |
commit | 45e4efba7fa2abe61d25e4f8b5bf482e19ff1280 (patch) | |
tree | b4e61cf5ef52b562e0aec7bb0a3c859dd0bd0496 /Modules | |
parent | 36c60fb2567a26ab23b533530d57d86207b91eea (diff) | |
download | cpython-45e4efba7fa2abe61d25e4f8b5bf482e19ff1280.zip cpython-45e4efba7fa2abe61d25e4f8b5bf482e19ff1280.tar.gz cpython-45e4efba7fa2abe61d25e4f8b5bf482e19ff1280.tar.bz2 |
bpo-33781: audioop: enhance rounding double as int (GH-7447)
Move the floor() call into fbound() to call floor() on a double
rather than an int. The change should enhance the rounding.
Document also (int)double rounding mode.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/audioop.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/Modules/audioop.c b/Modules/audioop.c index 80c8a2a..f4fdeb2 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -20,10 +20,17 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF}; static int fbound(double val, double minval, double maxval) { - if (val > maxval) + if (val > maxval) { val = maxval; - else if (val < minval + 1) + } + else if (val < minval + 1.0) { val = minval; + } + + /* Round towards minus infinity (-inf) */ + val = floor(val); + + /* Cast double to integer: round towards zero */ return (int)val; } @@ -924,9 +931,8 @@ audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width, for (i = 0; i < fragment->len; i += width) { double val = GETRAWSAMPLE(width, fragment->buf, i); - val *= factor; - val = floor(fbound(val, minval, maxval)); - SETRAWSAMPLE(width, ncp, i, (int)val); + int ival = fbound(val * factor, minval, maxval); + SETRAWSAMPLE(width, ncp, i, ival); } return rv; } @@ -973,9 +979,9 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width, for (i = 0; i < len; i += width*2) { double val1 = GETRAWSAMPLE(width, cp, i); double val2 = GETRAWSAMPLE(width, cp, i + width); - double val = val1*lfactor + val2*rfactor; - val = floor(fbound(val, minval, maxval)); - SETRAWSAMPLE(width, ncp, i/2, val); + double val = val1 * lfactor + val2 * rfactor; + int ival = fbound(val, minval, maxval); + SETRAWSAMPLE(width, ncp, i/2, ival); } return rv; } @@ -1021,8 +1027,8 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width, for (i = 0; i < fragment->len; i += width) { double val = GETRAWSAMPLE(width, fragment->buf, i); - int val1 = (int)floor(fbound(val*lfactor, minval, maxval)); - int val2 = (int)floor(fbound(val*rfactor, minval, maxval)); + int val1 = fbound(val * lfactor, minval, maxval); + int val2 = fbound(val * rfactor, minval, maxval); SETRAWSAMPLE(width, ncp, i*2, val1); SETRAWSAMPLE(width, ncp, i*2 + width, val2); } @@ -1080,7 +1086,7 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1, else { double fval = (double)val1 + (double)val2; /* truncate in case of overflow */ - newval = (int)floor(fbound(fval, minval, maxval)); + newval = fbound(fval, minval, maxval); } SETRAWSAMPLE(width, ncp, i, newval); |