将pow函数返回值强转为int时,5、11、15等数求平方输出错误
问题根因
pow是math.h库中实现的浮点运算函数,返回值为double类型,浮点运算本身存在固有精度误差:一方面不是所有整数运算结果都能被double类型完全精确存储,另一方面pow底层的近似计算逻辑也可能让整数平方的计算结果略小于理论上的整数值。
比如计算pow(5,2)时,实际返回的可能是24.999999999999996而非精确的25.0,而C语言中double强制转换为int的规则是直接截断小数部分,就会出现结果比正确值小1的问题。
问题验证
你可以新增一行打印输出pow的原始返回值,就能直观看到精度误差:
#include<stdio.h> #include<math.h> int main(){ int side; printf("Enter side value \n"); scanf("%d", &side); // 打印pow返回的原始浮点值,保留15位小数 printf("Raw pow return value: %.15f\n", pow(side, 2.0)); printf("The area is %d", (int) pow(side,2.0)); return 0; }
修复方案
- 最优方案:不要用
pow计算整数平方,直接使用整数乘法运算,完全没有精度问题,性能也远高于调用pow函数:
#include<stdio.h> int main(){ int side; printf("Enter side value \n"); scanf("%d", &side); printf("The area is %d", side * side); return 0; }
- 兼容方案:如果必须使用
pow的计算结果,转换为int前先做精度修正:- 加极小偏移量抵消负向误差后再转换:
(int)(pow(side,2.0) + 1e-6) - 用
round函数先对结果做四舍五入后再转换:(int)round(pow(side,2.0))
- 加极小偏移量抵消负向误差后再转换:
内容的提问来源于stack exchange,提问作者Psycho_boi07
相关产品推荐
相关产品推荐

