c中的pow()函数让我错误的结果

时间:2016-03-09 18:45:58

标签: c++ c

我试图通过根据字段中的位置添加值,将8位数组转换为0-255之间的数字。

如果我使用

int array[8]={
            0,1,1,0,0,0,0,1
    };
    int *p = array;
    int i;
    for (i = 0; i<8; i++){
        if(p[i]!=0){
            a = pow(2,i);
            printf("%i\n",a);
        }
    };

我明白了:

2
4
128

作为结果,到目前为止是正确的。 但如果我使用

int array[8]={
            0,1,1,0,0,0,0,1
    };
    int *p = array;
    int i;
    for (i = 0; i<8; i++){
        if(p[i]!=0){
            a = a + pow(2,i);
            printf("%i\n",a);
        }
    };

我反而得到:

2686758
2686762
2686890

当我期待:

134

我做错了什么?

4 个答案:

答案 0 :(得分:3)

您尚未将a初始化为0。

以下内容应该有效

int array[8]={
        0,1,1,0,0,0,0,1
};
int *p = array;
int i;
a = 0                     // << Initialise a
for (i = 0; i<8; i++){
    if(p[i]!=0){
        a = a + pow(2,i);
        printf("%i\n",a);
    }
};

您始终需要为变量提供初始值。否则,您可以期望它们以任何值开头。

在第二段代码中,您正在累积a=a+pow(2,i),并且在第一次使用a时,它将包含一些未确定的值。

答案 1 :(得分:1)

问题出在声明中:a = a + pow(2,1); a具有不确定的值,因为它尚未初始化并且您在算术运算中使用它。

答案 2 :(得分:1)

pow旨在计算两个实数(非整数)值的指数函数。所以你可以用它来计算π 3/2 。这对于计算2的整数幂实际上并不理想。更简单和更快(尽管可能不太可读,直到你习惯它)是将2 i 写为(1UL << i)。但是,在这种特殊情况下,您不需要其中任何一种。您可以执行以下操作:

int a = 0;
for (int index = 0, value = 1; index < 8; ++index, value *= 2)
  if (p[i]) a += value;

甚至更直接

int a = 0;
for (int value = 1, *p = array; value < 256; value *= 2, ++p)
  if (*p) a += value;

(如前所述,原文中的问题实际上并不是pow的使用,而是缺少初始化int a = 0。)

答案 3 :(得分:-1)

好吧!我通过将=0;添加到int a;初始化来修复它 坦克!