pow()函数结果强制转化为int造成误差的分析​

文章探讨了C语言中pow函数在将double类型结果转换为int时可能出现的精度丢失问题,提出三种解决方案:加0.5进行四舍五入、自定义pow函数以整型返回、使用round函数。同时提到不同编译器可能对结果的影响。
摘要由CSDN通过智能技术生成

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、pow使用的问题

在计算10^2时调用pow(10, 2),再强制类型转换为int类型后输出:

printf("%d",(int)pow(10,2));
 得到的结果却是:99

这是因为 double pow(double x, double y) ,返回值是采用数值逼近的方法得到的double类型值。例如返回值为99.9999999时,强制类型转换发生截断,得到99。

仔细分析后发现:

因为pow函数导致从double返回值类型向int型转化的时候是直接把小数部分切掉,

导致原先double型的小数部分不再四舍五入,从而失去了整数部分的精度,最终结果差1

2.1 最简单的解决方案:+ 0.5

(int)(pow(10, 2) + 0.5) // 返回值为100

2.2 解决方案2:

自行编写 pow() 函数,以整型作为形参与返回值。

2.3 解决方案3:

运用四舍五入函数:

printf("%d",(int)round(pow(10,2)));

ps: 在vc6.0运行是正确的,在codeblock上就是错误的。应该是编译器的问题了。

三、

3.1


总结

未完待续

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值