【问题标题】:Weird mistake in taking the sums of elements in alglib::real_1d_array在 alglib::real_1d_array 中取元素总和的奇怪错误
【发布时间】:2018-10-16 15:35:03
【问题描述】:

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

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

什么?!!!!!

【问题讨论】:

  • 你的元素实际上是 1 还是一个略小于 1 的数字?如果它们不是 1,那么将它们作为整数相加将产生 0。尝试打印 (int)v[i]。我们需要一个minimal reproducible example
  • @AlanBirtles 啊哈。我懂了。我已将int 更改为double

标签: c++ alglib


【解决方案1】:

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

如果您的元素的值是0.999999999 而不是1.00000,那么打印它们可能会舍入到1.00000,但是当您将它们添加到整数时,值将被截断为0。

根据提供的输出判断,除了最后一个大于或等于 1 之外,您的所有值都小于 1

有两种可能的解决方案:

  1. sum的类型更改为floatdouble
  2. 将您的计算更改为:sum += static_cast&lt;int&gt;(round( v[i] ));

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

【讨论】:

    【解决方案2】:

    如果您使用浮点整数,请使用双精度数来存储总和。使用整数将导致变量被隐式转换为一个 int ,它只是削减尾数:

    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 */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 2018-01-25
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      相关资源
      最近更新 更多