为什么pow(5,3)不返回125?

时间:2017-11-21 06:48:49

标签: c math pow calculation

当我使用pow()功能时,有时结果会被一个人关闭。例如,这段代码产生了124,但我知道5³应该是125。

#include<stdio.h>
#include<math.h>

int main(){
    int i = pow(5, 3);
    printf("%d", i);
}

为什么结果错了?

4 个答案:

答案 0 :(得分:8)

您的问题是您正在使用浮点数学混合整数变量。我敢打赌,5^3的结果类似于124.999999,因为四舍五入问题,当转换为整数变量时,floor编辑为124

有三种方法可以解决这个问题:

  1. 更安全地混合浮动数学和整数

    int x=5,y=3,z;
    z=floor(pow(x,y)+0.5);
    // or
    z=round(pow(x,y));
    

    但使用此功能将始终存在舍入错误的风险,从而影响结果,尤其是对于较高的指数。

  2. 仅计算浮动变量

    所以用intfloat替换double。这比#1 更安全,但在某些情况下仍然无法使用(取决于任务)。并且可能需要偶尔floor,ceil,round来正确获得想要的结果。

  3. 仅使用整数数学

    这是最安全的方式(除非你越过int限制)。可以相对容易地在整数数学上计算pow

答案 1 :(得分:3)

pow(x, y)最有可能被实现为exp(y * log(x)):现代CPU可以在几个手腕上轻松评估explog

虽然适用于许多科学应用程序,但是当将结果截断为整数时,结果可能会因为简单的参数而被关闭。这就是这里发生的事情。

最好的办法是为整数参数推送自己的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;
}