在C中使用pow函数的计算错误

时间:2017-03-19 22:51:36

标签: c function pow

我正在用C语言开始编码,我正在做练习,但看到了错误的计算测试代码:

int main(){

int number;
int square;

printf("Pick a number: ");
scanf("%d",&number);

while(number<=0)
{
    printf("ERROR: The number MUST be greater than zero\nPick a number greater than zero: ");
    scanf("%d",&number);
}

square = pow(number,2);

printf("\nThe square of the number is: %d\n\n",square);
system("pause");

return 0;}

现在......一切正常,但是当我使用数字“5”时,它显示结果“24”,当它应该是“25”时。有人知道为什么会这样吗?

4 个答案:

答案 0 :(得分:2)

pow获取double个参数并返回double。所以你得到一个舍入误差。

答案 1 :(得分:0)

函数pow()double值作为输入参数,并返回double,因为它在C标准库中定义。但是,传递给(number)的变量是int变量。由于编译器在计算过程中使用非整数值,因此会导致舍入错误。

要解决此错误,请使用number类型而不是double声明int

double number;

这应该对四舍五入问题进行排序。

答案 2 :(得分:0)

因为在C标准库中,pow被定义为一个带有双参数并返回double值的函数。即使有关实现的标准不需要,通常的实现也会使用(或多或少)以下公式: pow(x, y) = exp(y * log(x)) 。这意味着即使传递整数值,内部操作也将使用非整数值,并且将发生舍入错误。

这就是你当前用5实现的情况。为了确保它,只需将结果打印为double:

double dsq = pow(5, 2);
printf("%f", dsq);

dsq(在你的实现中)应稍微关闭,当四舍五入时你得到24

答案 3 :(得分:-2)

哼哼我认为你应该在int中施放pow:

square = (int)pow(number,2);