diff options
author | Stefano Rivera <stefano@rivera.za.net> | 2020-10-10 13:54:28 -0700 |
---|---|---|
committer | Stefano Rivera <stefano@rivera.za.net> | 2020-10-10 13:54:28 -0700 |
commit | abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6 (patch) | |
tree | 3df494b98f5e1a961ae3f63ea96344f644e5326a /lib_pypy | |
parent | bpo-29004: Document binascii.crc_hqx() implements CRC-CCITT (diff) | |
download | pypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.tar.gz pypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.tar.bz2 pypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.zip |
bpo-33781: audioop: enhance rounding double as int
Diffstat (limited to 'lib_pypy')
-rw-r--r-- | lib_pypy/_audioop_build.py | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib_pypy/_audioop_build.py b/lib_pypy/_audioop_build.py index 88d67d9c4b..043ea849c3 100644 --- a/lib_pypy/_audioop_build.py +++ b/lib_pypy/_audioop_build.py @@ -313,11 +313,18 @@ static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1}; 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; - return val; + } + + /* Round towards minus infinity (-inf) */ + val = floor(val); + + /* Cast double to integer: round towards zero */ + return (int)val; } static int @@ -409,11 +416,11 @@ void tostereo(char* rv, char* cp, size_t len, int size, else if ( size == 2 ) val = (int)*SHORTP(cp, i); else if ( size == 4 ) val = (int)*LONGP(cp, i); - fval = (double)val*fac1; - val1 = (int)floor(fbound(fval, minval, maxval)); + fval = (double)val * fac1; + val1 = fbound(fval, minval, maxval); - fval = (double)val*fac2; - val2 = (int)floor(fbound(fval, minval, maxval)); + fval = (double)val * fac2; + val2 = fbound(fval, minval, maxval); if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1; else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1; @@ -454,7 +461,7 @@ void add(char* rv, char* cp1, char* cp2, size_t len1, int size) else { double fval = (double)val1 + (double)val2; /* truncate in case of overflow */ - newval = (int)floor(fbound(fval, minval, maxval)); + newval = fbound(fval, minval, maxval); } if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval; |