#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。这解释了您观察到的输出。