通过更改代码格式来计算结构向量中包含的双精度变量的平均值的不同结果?
Different results calculating the average of double variables contained in a vector of structs by altering code formatting?
我目前正在与OpenCV/C++的一个非常奇怪的行为作斗争。这就是我正在做的:
更新1:这里更多信息:
我计算一组像素的梯度方向,并将它们存储在自我声明struct
的double
字段中。结构元素存储在向量中。
myfunct1() {
(...)
c.grad_orientation = (sum_ori / highgrads.size()) + M_PI; // +M_PI because i just want to rotate the angle around 180°.
(...)
my_struct_vector.push_back(c);
}
后来我在一个向量中存储了几个c
,并想估计每个grad_orientation
的平均值,存储在向量的每个结构元素中,如下所示:
myfunct0() {
myfunct1(); //adds element to the my_struct_vector
(...)
int n = 0;
double total_ori = 0.0;
for (uint i = 0; i < my_struct_vector.size(); ++i) {
total_ori += my_struct_vector[i].grad_orientation;
n++;
}
azimuth = (total_ori / n);
cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees
}
现在是有趣的部分:如果我在某些情况下这样做,cout
打印215.963
.这是我最常得到的结果(正是这个结果)。 在某些情况下,如果我添加上面提到的这些矩阵,或者(是的,真的)如果我将结构中保存grad_orientation
的双精度字段在代码方面向上移动一列,我会得到223.442
.因此,代码中两个结果之间的差异仅如下:
struct my_struct {
std::vector<cv::Point> contour_shadow;
std::vector<cv::Point> contour_light;
cv::RotatedRect rect;
cv::Point pf;
cv::Point pc;
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result.
bool grad_flag;
double grad_magnitude;
};
打印的结果不仅取决于列在结构声明中的位置,还取决于我何时更改代码的不同部分。
这可能与双精度有关,但是如果我移动代码列,为什么它会改变呢?
好的,感谢罗尔在这方面帮助我。我希望可以回答我自己的问题只是为了标记它已回答?
问题确实是在结构中使用未初始化的内存和布尔标志(在错误的决定之后)(当然,如果未初始化,则不是零)。事情很明显,但代码中的行交换(甚至在结构之外!)导致错误(但不知何故非随机)值的事实让我有点困惑。
请参阅此处 默认情况下,C++结构的成员是否初始化为 0?
相关文章:
- 在 C++ 中将双精度变量写入二进制文件
- 将双精度变量设置为另一个变量的值
- 将双精度值转换为 char 变量时字符串流如何工作
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 警告:左移计数 >= 在 C++ 中将字节流读取为双精度变量时的类型宽度
- 为什么双精度引用值在分配给C++中的浮点变量时不会更改
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- C++ - 截断变量文件名中双精度的小数位
- 为什么自动推断这个变量为双精度而不是浮点数?
- 如何使用 c++ 将多个变量存储在一个变量中?例如,双精度 x,y,z 包含在可变点 p 中
- 带有双精度的变量无法正常工作
- 整数和双精度变量的初始化
- 双变量的精度仅为十点后的2个位置
- 将 Int 指针分配给双精度变量
- 如何在将双精度作为输入后将整行作为字符串变量的输入
- 如何在 for 循环内部或外部打印双精度变量
- 由将值分配给双精度类型的变量而导致的浮点异常
- 通过更改代码格式来计算结构向量中包含的双精度变量的平均值的不同结果?
- 如何让用户输入正双精度变量
- 变量的值为整数和双精度