C 中的 pow() 函数给我带来了错误的结果
pow() function in c is getting me wrong results
我正在尝试通过根据字段中的位置添加值来将 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;
来修复它坦克!
相关文章:
- 我在贪吃蛇游戏中收到了错误代码 -1073741571
- C++ 犰狳库中的sort_index()函数给出了错误的结果
- 纹理单位重叠?渲染了错误的纹理
- 由于签名差异,调用了错误的子类函数
- srand() 输出了错误的值
- C++:使用类在向量中搜索特定元素时,我得到了错误的结果
- 我正在尝试传递DMA数组及其大小作为参数,但它给出了错误
- 运行时多态性 - 箭头运算符访问了错误的成员?
- IM 试图显示对象数组,但它给出了错误的输出
- 虽然循环即使应用了错误条件也不会退出
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- QScreen geometry()api为分辨率2736 x 1824和2560 x 1600提供了错误的值
- std::allocator_traits::construct调用了错误的构造函数
- 为什么我的代码返回了错误的平方值?C++
- 带有大结构变量的 CUDA 内核函数给出了错误的结果
- Visual Studio控制台调试了错误的文件
- 我的模板二叉搜索树类给出了错误"Node<T>: no appropriate default constructor available,"如何解决这个问题?
- strcpy_s之后的strcat_s给出了错误
- 为什么分段错误来了
- Makefiles:是否有一种通用的方法来显示makefile中的哪一行导致了错误