当我使用pow()
功能时,有时结果会被一个人关闭。例如,这段代码产生了124,但我知道5³应该是125。
#include<stdio.h>
#include<math.h>
int main(){
int i = pow(5, 3);
printf("%d", i);
}
为什么结果错了?
答案 0 :(得分:8)
您的问题是您正在使用浮点数学混合整数变量。我敢打赌,5^3
的结果类似于124.999999
,因为四舍五入问题,当转换为整数变量时,floor
编辑为124
。
有三种方法可以解决这个问题:
更安全地混合浮动数学和整数
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
:
答案 1 :(得分:3)
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)
答案 2 :(得分:2)
使用浮动数据类型
insert into rule (pk_rule, name, ruleid, description)
values (master_seq.nextval, 'TESTRULE', 14, 'TEST RULE DESCRIPTION')
答案 3 :(得分:-3)
您可以使用此功能代替pow
:
long long int Pow(long long int base, unsigned int exp)
{
if (exp > 0)
return base * Pow(base, exp-1);
return 1;
}