Pow函数返回错误结果

问题描述 投票:-2回答:4

[当我使用pow()功能时,有时结果会偏离一。例如,此代码产生124,但我知道5³应该是125。

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

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

为什么结果不正确?

c math pow calculation
4个回答
8
投票

您的问题是,您正在将整数变量与浮点运算混合在一起。我敢打赌,由于舍入问题,5^3的结果类似于124.999999,并且当转换为整数变量时,将floor ed设置为124

有3种解决方法:

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

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

    但是使用此方法将始终存在舍入误差可能影响结果的风险,尤其是对于较高的指数。

  2. 仅对浮动变量进行计算

    因此将int替换为floatdouble。这比#1安全一些,但在某些情况下仍然不可用(取决于任务)。并且可能偶尔需要floor,ceil,round才能正确获得所需的结果。

  3. 仅使用整数数学

    这是最安全的方法(除非您超过int限制)。 pow可以相对容易地通过整数数学计算得出:


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
投票

使用浮动数据类型

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

int main()
{
    float x=2;
    float y=2;
    float p= pow(x,y);
    printf("%f",p);
    return 0;
}

-3
投票

您可以使用此功能代替pow

long long int Pow(long long int base, unsigned int exp)
{
    if (exp > 0)
        return base * Pow(base, exp-1);
    return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.