int main()
{
char arr[3]={'1','5','3'};
int sum=0;
for (int i=0;i<3;i++)
{
sum+=pow((arr[i]-48),3);
printf("%d to the power 3 is: %f\n",arr[i]-48,pow((arr[i]-48),3));
}
printf("sum is %d\n",sum);
}
预期产出:
1 to the power 3 is: 1.000000
5 to the power 3 is: 125.000000
3 to the power 3 is: 27.000000
sum is 153
实际输出:
1 to the power 3 is: 1.000000
5 to the power 3 is: 125.000000
3 to the power 3 is: 27.000000
sum is 152
Here is an image of the Output
输出不应该是153而不 152?
编辑:如果不是sum + = pow((arr [i] -48),3);我用左 总和+ =(int)的(地板(POW((ARR [I] -48),3)));
输出正确地作为153.所以我不会返回较小的整数,或者就类型而言,将float转换为整数,返回较小的值就是这里的情况
答案 0 :(得分:0)
微软pow
例程非常糟糕。正如macOS pow
所示,可以为这些和类似的操作数返回正确的结果,但Microsoft要么没有投入工程工作来执行此操作,要么选择不更改其pow
实现。即使对于具有可在浮点表示的数学结果的小整数操作数,pow
也可能返回略大于或略小于正确值的结果。当返回小于精确整数结果的结果时,将其转换为整数会导致截断到下一个较低的整数。
计算pow
很困难,并非所有实施都能很好地完成。对于浮点函数,理论上可能的最佳质量是正确舍入。正确舍入的例程返回以浮点格式表示的最接近精确数学结果的数字,在由所选舍入规则控制的方向上舍入。 (最常用的舍入规则是舍入到最接近的值,并且连接到偶数低位。其他规则包括向+∞舍入,向-∞舍入,向零舍入。)计算{{1}非常困难正确的舍入,没有商业或常用的实现,我知道这样做。
然而,可以设计pow
,以便只要以浮点格式表示确切结果,它就会返回确切的结果。我记得,当前pow
pow实现了这一点。因此,当使用macOS工具编译和执行时,问题中的程序将产生预期的结果。 Microsoft的macOS
没有此属性,因此计算pow
可能会返回略小于 x 3 的值,即使 x < / em> 3 是可以表示的。
即使使用高质量pow(x, 3)
实现,由于速度原因,通常也不希望使用小整数幂的pow
。计算pow
比计算pow(x, 3)
慢。