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

miscalculation using pow function in C

我开始用 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”。有人知道为什么会这样吗?

pow 采用 double 个参数和 returns 个 double。所以你得到了一个舍入错误。

嗯,我认为你应该将 pow 转换为 int :

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

函数 pow() 接受一个 double 值作为输入参数,returns 也接受一个 double,正如它在 C 标准库中定义的那样。但是,您传递给 (number) 的变量是一个 int 变量。这会导致舍入错误,因为编译器在计算过程中使用了非整数值。

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

double number;

这应该解决舍入问题。

因为在 C 标准库中,pow 被定义为一个接受双参数并返回双值的函数。即使标准对实现没有任何要求,常见的实现(或多或少)使用以下公式:pow(x, y) = exp(y * log(x))。这意味着即使你传递整数值,内部操作也会使用非整数值,并且会出现舍入错误。

这就是您当前使用 5 的实现所发生的情况。为确保这一点,只需将结果打印为双精度:

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

dsq(在你的实现中)应该稍微偏离,四舍五入时你会得到 24