使用pow函数实现减法操作后输出异常的问题排查
问题根因:
pow()的浮点精度缺陷 pow()是浮点函数,精度有限:pow(2,i)返回double类型值,而double仅能精确表示15-17位十进制数字。你的ans是1到1e9的和,计算得500000000500000000,这是一个18位的数。当i较小时,2^i的量级远小于ans,此时ans转成double会丢失低数位精度,ans - pow(2,i)在浮点计算中被判定为和原ans相等,赋值回long long后自然看不出变化。- 整数递推无精度损失:用
long long val = 1; val *= 2;的方式生成2^i,是纯整数运算,long long能容纳到9e18(远大于你的ans和2^60以内的数),每次生成的数值都是精确的,减法操作自然能正确修改ans。 - 直观例子:比如
i=29时,2^29=536870912,但ans转成double后是5.000000005e17,这个浮点值的精度覆盖不到后9位的500000000,所以减去5e8对浮点表示的ans毫无影响;而整数递推得到的536870912是精确值,直接和ans做整数减法,结果完全准确。
内容的提问来源于stack exchange,提问作者ch_dktomar
相关产品推荐
相关产品推荐

