[当我使用pow()
功能时,有时结果会偏离一。例如,此代码产生124,但我知道5³应该是125。
#include<stdio.h>
#include<math.h>
int main(){
int i = pow(5, 3);
printf("%d", i);
}
为什么结果不正确?
您的问题是,您正在将整数变量与浮点运算混合在一起。我敢打赌,由于舍入问题,5^3
的结果类似于124.999999
,并且当转换为整数变量时,将floor
ed设置为124
。
有3种解决方法:
更安全地混合使用浮动数学和整数
int x=5,y=3,z;
z=floor(pow(x,y)+0.5);
// or
z=round(pow(x,y));
但是使用此方法将始终存在舍入误差可能影响结果的风险,尤其是对于较高的指数。
仅对浮动变量进行计算
因此将int
替换为float
或double
。这比#1安全一些,但在某些情况下仍然不可用(取决于任务)。并且可能偶尔需要floor,ceil,round
才能正确获得所需的结果。
仅使用整数数学
这是最安全的方法(除非您超过int
限制)。 pow
可以相对容易地通过整数数学计算得出:
[pow(x, y)
最有可能被实现为exp(y * log(x))
:现代CPU可以通过几次轻拂就可以评估exp
和log
。
尽管对于许多科学应用程序来说都是足够的,但将结果截断为整数时,即使是平凡的参数,其结果也可能不正确。这就是这里发生的事情。
您最好的选择是使用自己的pow
版本获取整数参数;即从一个好的图书馆中找到一个。作为起点,请参见The most efficient way to implement an integer based power function pow(int, int)
使用浮动数据类型
#include <stdio.h>
#include <math.h>
int main()
{
float x=2;
float y=2;
float p= pow(x,y);
printf("%f",p);
return 0;
}
您可以使用此功能代替pow
:
long long int Pow(long long int base, unsigned int exp)
{
if (exp > 0)
return base * Pow(base, exp-1);
return 1;
}