mirror of
https://github.com/python/cpython.git
synced 2025-11-10 14:31:24 +00:00
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.
This commit is contained in:
parent
36c60fb256
commit
45e4efba7f
1 changed files with 17 additions and 11 deletions
|
|
@ -20,10 +20,17 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
|
||||||
static int
|
static int
|
||||||
fbound(double val, double minval, double maxval)
|
fbound(double val, double minval, double maxval)
|
||||||
{
|
{
|
||||||
if (val > maxval)
|
if (val > maxval) {
|
||||||
val = maxval;
|
val = maxval;
|
||||||
else if (val < minval + 1)
|
}
|
||||||
|
else if (val < minval + 1.0) {
|
||||||
val = minval;
|
val = minval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Round towards minus infinity (-inf) */
|
||||||
|
val = floor(val);
|
||||||
|
|
||||||
|
/* Cast double to integer: round towards zero */
|
||||||
return (int)val;
|
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) {
|
for (i = 0; i < fragment->len; i += width) {
|
||||||
double val = GETRAWSAMPLE(width, fragment->buf, i);
|
double val = GETRAWSAMPLE(width, fragment->buf, i);
|
||||||
val *= factor;
|
int ival = fbound(val * factor, minval, maxval);
|
||||||
val = floor(fbound(val, minval, maxval));
|
SETRAWSAMPLE(width, ncp, i, ival);
|
||||||
SETRAWSAMPLE(width, ncp, i, (int)val);
|
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
@ -973,9 +979,9 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width,
|
||||||
for (i = 0; i < len; i += width*2) {
|
for (i = 0; i < len; i += width*2) {
|
||||||
double val1 = GETRAWSAMPLE(width, cp, i);
|
double val1 = GETRAWSAMPLE(width, cp, i);
|
||||||
double val2 = GETRAWSAMPLE(width, cp, i + width);
|
double val2 = GETRAWSAMPLE(width, cp, i + width);
|
||||||
double val = val1*lfactor + val2*rfactor;
|
double val = val1 * lfactor + val2 * rfactor;
|
||||||
val = floor(fbound(val, minval, maxval));
|
int ival = fbound(val, minval, maxval);
|
||||||
SETRAWSAMPLE(width, ncp, i/2, val);
|
SETRAWSAMPLE(width, ncp, i/2, ival);
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
@ -1021,8 +1027,8 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width,
|
||||||
|
|
||||||
for (i = 0; i < fragment->len; i += width) {
|
for (i = 0; i < fragment->len; i += width) {
|
||||||
double val = GETRAWSAMPLE(width, fragment->buf, i);
|
double val = GETRAWSAMPLE(width, fragment->buf, i);
|
||||||
int val1 = (int)floor(fbound(val*lfactor, minval, maxval));
|
int val1 = fbound(val * lfactor, minval, maxval);
|
||||||
int val2 = (int)floor(fbound(val*rfactor, minval, maxval));
|
int val2 = fbound(val * rfactor, minval, maxval);
|
||||||
SETRAWSAMPLE(width, ncp, i*2, val1);
|
SETRAWSAMPLE(width, ncp, i*2, val1);
|
||||||
SETRAWSAMPLE(width, ncp, i*2 + width, val2);
|
SETRAWSAMPLE(width, ncp, i*2 + width, val2);
|
||||||
}
|
}
|
||||||
|
|
@ -1080,7 +1086,7 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1,
|
||||||
else {
|
else {
|
||||||
double fval = (double)val1 + (double)val2;
|
double fval = (double)val1 + (double)val2;
|
||||||
/* truncate in case of overflow */
|
/* truncate in case of overflow */
|
||||||
newval = (int)floor(fbound(fval, minval, maxval));
|
newval = fbound(fval, minval, maxval);
|
||||||
}
|
}
|
||||||
|
|
||||||
SETRAWSAMPLE(width, ncp, i, newval);
|
SETRAWSAMPLE(width, ncp, i, newval);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue