在 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
我开始用 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