将alglib :: real_1d_array中的元素求和时出现奇怪的错误

时间:2018-10-16 15:35:03

标签: c++ alglib

好的,这次我有一个非常奇怪的错误,这种错误并不总是出现。这是实际上包含问题的功能。它所做的只是从字面上对向量的元素求和。它在大多数情况下都有效,但是在少数情况下,它往往会成为严重问题。

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

什么?!!!!!

2 个答案:

答案 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种可能的解决方案:

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

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