大家好,我是讯享网,大家多多关注。
幂函数是C语言标准库自带的计算函数,其接口存在于math.h文件中,使用前要包含。该函数用于计算x的y次方,并将结果返回给用户。直接打电话很方便。在TC2.0中,它的原型是extern float pow(float x,float y);在VC6.0中,原型是double pow(双x,双y)。
VC6.0中的代码实现:
pow函数使用范例幂函数用法示例
可以看出计算结果符合预期,但是最近我在使用MSP430进行远程升级时遇到了这样一个问题:
升级前,平台会发送一帧升级包的描述信息,包含总帧数,用可见字符表示。例如,如果要传输的帧的总数是167,这意味着& # 39;’167”,我需要将其转换为167并存储。按照它的规律,我首先想到的是用pow函数求解,也就是a * 100+b * 10+c的思路,但是计算出来的结果总是166,导致升级不成功。真是百思不得其解。
后来我仔细研究了pow函数的实现,终于发现了问题。由于pow函数的参数和返回值都是双类型,所以它在计算机内存中的表达式本身就是一种近似,存在一定的表达式误差。比如100.0在内存中可能用99.99999表示,但转换成无符号int类型时,精度会丢失,导致转换结果为99。
只要找到问题的原因,我们就能解决它。根据这个特点,我们可以采用四舍五入的方法。比如我们可以在结果的基础上加一个小的常数值const double EPS = 1e-6;也可以使用round函数直接取整。
另外,和编译器也有很大关系。有些编译器可以保证正确的计算结果,但是我用的IAR自带的编译器就不行。类似标准库中的很多函数,比如三角函数,也有这个问题,所以使用幂函数的时候要非常小心,尤其是把结果转换成整数的时候。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/20365.html