C++中INT32_MAX乘0.1f与整除10结果不一致的原因是什么
计算结果差异原因分析
- 先明确基础数值:
INT32_MAX是32位有符号整数的最大值,固定为2^31 - 1 = 2147483647 - 整数除法的结果逻辑
C++中针对正整数的整数除法默认采用向零取整规则。2147483647除以10的数学计算结果为214748364.7,直接丢弃小数部分后得到整数214748364,也就是
res2的输出值,这个结果完全符合整数运算的预期。
- 单精度浮点数乘法的精度损失是差异核心
float类型为单精度浮点数,仅配备23位有效尾数,最多只能精确表示不超过2^24 = 16777216的整数,INT32_MAX远高于这个阈值,运算过程中会发生两次精度舍入:
- 运算
INT32_MAX * 0.1f时,首先会把INT32_MAX转换为float类型,此时2147483647无法被float精确存储,会被舍入到最接近的可表示值2147483648- 用舍入后的
2147483648乘以0.1f,得到的数学结果为214748364.8,这个值同样超出float的精确表示范围,会被再次舍入为float可表示的最接近值214748368- 最后将该
float值转换为int64_t类型时,直接取整数部分就得到了res1的输出结果214748368
内容的提问来源于stack exchange,提问作者MKFein
相关产品推荐
相关产品推荐

