在 alglib::real_1d_array 中获取元素总和的奇怪错误

Weird mistake in taking the sums of elements in alglib::real_1d_array

本文关键字:和的 错误 元素 real alglib 1d array 获取      更新时间:2023-10-16

好吧,这次我有一个非常奇怪的错误,并不总是出现。这是实际包含问题的函数。它所做的只是对向量的元素求和。它在大多数情况下有效,但在少数情况下,它往往会变得非常成问题。

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

什么?!!!!!

由于您的 sum 变量是一个整数,因此在对向量中不是整数的元素求和时,您可能无法获得预期的结果。

如果您的元素的值为0.999999999而不是1.00000则打印它们可以四舍五入为1.00000但是当您将它们添加到整数时,该值将被截断为 0。

从提供的输出来看,除了最后一个大于或等于 1 的值外,所有值都小于1

有两种可能的解决方案:

  1. sum类型更改为floatdouble
  2. 将计算更改为:sum += static_cast<int>(round( v[i] ));

请注意,您的编译器可能警告将双精度截断为整数。注意编译器警告,它们通常表示错误。

如注释所示,如果您正在使用浮点整数,请使用双精度来存储总和。 使用整数将导致变量被隐式转换为刚好切割尾数的整数:

0.9999998 -> 0

根据 cout::p recision,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 */