幂函数的c代码对特定值给出了错误的结果

  • 本文关键字:错误 结果 函数 代码 c
  • 更新时间 :
  • 英文 :

#include <stdio.h>
#include <math.h>
int main()
{
int base, exponent;
printf("Enter the value of base: ");
scanf("%d", &base);
printf("Enter the value of exponent: ");
scanf("%d", &exponent);
int power = pow(base, exponent);
printf("%d", power);
return 0;
}

运行时的代码会为除base=5和exponent=4之外的所有输入提供正确的值。答案是624,但应该是625。

这是由pow的实现不足引起的。虽然正确的结果625是可表示的,但它返回的是624.9999999999998863131622783839702601171875。

pow是一个很难很好地实现的函数,即使精确的实数算术结果可以用double格式表示,一些实现也不会返回正确的结果。函数是使用近似实现的,有时这些近似会产生不准确的结果。

如果您将代码更改为:

double power = pow(base, exponent);
printf("%gn", power);
printf("%.99gn", power);

你会看到这样的输出:

625624.9999999999999 8863131622783839702606201171875

第一行显示四舍五入到六位有效十进制数字的结果(g转换的默认值(,然后修剪尾部零。第二行显示了确切的值。(一些C实现也可能无法在这一行中显示确切的值,但它们应该向您显示足够的信息,以便将其与625区分开来。(

当624.999999998863131622783839702606201171875转换为int时,分数部分被丢弃,留下624。这解释了您观察到的输出。

最新更新