Open Timost opened 1 month ago
take
Hi, wouldn't 16 be the correct value returned for 100 * 36 mod 256
?
Hi,
yes, 16
is the value corresponding to the overflow, so in a sense it is correct.
However, AFAICT, other UInt
dtypes do not behave this way and are casted to the "next bigger" dtype when computation results overflow.
I think the behavior should be coherent across the various UInt
flavours.
I believe pandas will overflow if integer being multiplied can be stored in the given dtype, but otherwise will upcast.
s = pd.Series([36], dtype='Int16')
print((s * 1000).dtype, (s * 1000).iloc[0])
# Int16 -29536
print((s * 32767).dtype, (s * 32767).iloc[0])
# Int16 -36
print((s * 32768).dtype, (s * 32768).iloc[0])
# Int32 1179648
Pandas version checks
[X] I have checked that this issue has not already been reported.
[X] I have confirmed this bug exists on the latest version of pandas.
[ ] I have confirmed this bug exists on the main branch of pandas.
Reproducible Example
Issue Description
When multiplying a
UInt8
series by a python integer, for which the result overflows the dtype range, the resulting values are wrong.AFAICT this only happens with the
UInt8
dtype (I testedUInt8
,UInt16
,UInt32
andUInt64
). Other UInt dtypes are properly casted to the "next" dtype.Anybody computing percentages on UInt8 dtypes will easily hit this issue.
This was introduced in the 2.1.0 Release.
Expected Behavior
I expect the series to be casted to
UInt16
when the results overflow theUInt8
range and return the correct values.Installed Versions