BIZZARE OUTPUT。 SHOULDN&T;输出量为153以上

时间:2018-06-11 09:50:30

标签: c output pow

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转换为整数,返回较小的值就是这里的情况

1 个答案:

答案 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)慢。