好的,这次我有一个非常奇怪的错误,这种错误并不总是出现。这是实际上包含问题的功能。它所做的只是从字面上对向量的元素求和。它在大多数情况下都有效,但是在少数情况下,它往往会成为严重问题。
int sumvec(vect v) {
int i = 0;
int sum = 0;
int l = v.length();
std::cout << "Sum of vector " << v.tostring(3) << std::endl;
for (; i < l; i++) {
sum += v[i];
std::cout << v[i] << " " << sum << " ";
};
std::cout << std::endl;
return sum;
}
此处vect
是使用typedef alglib::real_1d_array vect;
定义的。好,那我能得到什么?嗯。
Sum of vector [1.000,1.000,0.000,1.000,1.000,1.000]
1 0 1 0 0 0 1 0 1 0 1 1
什么?!!!!!
答案 0 :(得分:1)
如前所述,如果使用浮点整数,请使用双精度来存储总和。使用整数将导致该变量隐式转换为只截尾数的整数:
0.9999998-> 0
根据cout :: precision,将0.99999打印为1.0000(四舍五入),或者不将std :: fixed打印为1(在示例中可能发生的情况)。
double a = 0.999;
std::cout.precision(2);
std::cout << a << std::endl; /* This prints 1 */
std::cout << std::fixed;
std::cout << a << endl; /* This prints 1.00 */
答案 1 :(得分:1)
由于sum变量是整数,所以对向量中不是整数的元素求和可能不会得到预期的结果。
如果您的元素具有0.999999999
而不是1.00000
的值,那么打印它们可以四舍五入为1.00000
,但是当您将它们添加到整数时,该值将被截断为0。
根据提供的输出判断,除最后一个值大于或等于1之外,所有值均小于1
。
有2种可能的解决方案:
sum
的类型更改为float
或double
。sum += static_cast<int>(round( v[i] ));
请注意,编译器可能会警告将双精度整数截断为整数。注意编译器警告,它们通常表示错误。