为何Numpy中整数除法结果dtype始终为float64?
为什么NumPy中整数类型相除的结果dtype统一为float64?
这是NumPy预先硬编码的设计规则,和np.can_cast的转换能力、通用类型提升逻辑无关,核心原因有三个:
除法ufunc的类型映射是预设好的
NumPy的除法操作对应的np.divideufunc,其输入输出的类型组合是提前定义在ufunc.types里的。你可以运行下面的代码验证:print(np.divide.types)输出里能看到所有整数类型配对的条目,比如
bb->d(b代表int8,d代表float64)、hh->d(h代表int16),这些条目直接规定了任意整数类型相除的结果都是float64,完全是预先设定的映射,不是通过np.result_type之类的通用规则动态算出来的。为了最大化结果精度的决策
整数除法几乎必然产生非整数结果,NumPy选float64作为统一输出类型,是为了避免精度损失:- float64可以精确表示所有253以内的整数,而NumPy里从int8到int64的所有整数类型,取值范围都远小于253,用float64能保证整数除法的结果尽可能精确。
- 统一用float64也让结果类型更稳定,不管输入的整数类型是啥,输出类型都固定,减少了类型不一致带来的麻烦。
和混合类型除法的规则不一样
如果是整数和浮点数混合除法(比如int8 / float16),会遵循通用的类型提升规则:先把整数转成对应的浮点类型,再做运算,所以结果是float16。但纯整数间的除法是特殊场景,被单独处理成输出float64,这是两种完全不同的类型推导逻辑。
总结一下:NumPy对整数除法的类型规则是“特例优先”,为了精度和稳定性直接固定死了输出为float64,和能不能转成更小的浮点类型没关系。
内容的提问来源于stack exchange,提问作者14thibea
相关产品推荐
相关产品推荐

