C 中的 pow() 函数给我带来了错误的结果

pow() function in c is getting me wrong results

本文关键字:来了 错误 结果 pow 中的 函数      更新时间:2023-10-16

我正在尝试通过根据字段中的位置添加值来将 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("%in",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("%in",a);
        }
    };

相反,我得到:

2686758
2686762
2686890

当我期望:

134

我做错了什么?

您尚未将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("%in",a);
    }
};

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

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

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

pow旨在

计算两个实数(非整数)值的指数函数。因此,您可以使用它来计算π3/2。它确实不适合计算 2 的整数幂。更简单和更快(尽管在您习惯之前可能不太可读)是将 2i 写为 (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

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