对 alglib::real_1d_array 中的元素求和时出现奇怪的错误
Weird mistake in taking the sums of elements in alglib::real_1d_array
好的,这次我有一个并不总是出现的非常奇怪的错误。这是实际包含问题的功能。它所做的只是对向量的元素求和。它在大多数情况下都有效,但在少数情况下它往往会变得很成问题。
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
什么?!!!!!!
如评论所述,如果您使用的是浮点整数,请使用双精度数来存储总和。使用整数将导致变量被隐式转换为仅削减尾数的 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 */
由于您的总和变量是一个整数,因此在对向量中的非整数元素求和时可能无法获得预期结果。
如果您的元素具有 0.999999999
而不是 1.00000
的值,那么打印它们可以四舍五入为 1.00000
但是当您将它们添加到整数时,该值将被截断为0.
根据提供的输出判断,除了最后一个大于或等于 1 的值外,您的所有值都小于 1
。
有 2 种可能的解决方案:
- 将
sum
的类型更改为 float
或 double
。
- 将您的计算更改为:
sum += static_cast<int>(round( v[i] ));
请注意,您的编译器可能会警告将双精度截断为整数。注意编译器警告,它们通常表示存在错误。
好的,这次我有一个并不总是出现的非常奇怪的错误。这是实际包含问题的功能。它所做的只是对向量的元素求和。它在大多数情况下都有效,但在少数情况下它往往会变得很成问题。
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
什么?!!!!!!
如评论所述,如果您使用的是浮点整数,请使用双精度数来存储总和。使用整数将导致变量被隐式转换为仅削减尾数的 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 */
由于您的总和变量是一个整数,因此在对向量中的非整数元素求和时可能无法获得预期结果。
如果您的元素具有 0.999999999
而不是 1.00000
的值,那么打印它们可以四舍五入为 1.00000
但是当您将它们添加到整数时,该值将被截断为0.
根据提供的输出判断,除了最后一个大于或等于 1 的值外,您的所有值都小于 1
。
有 2 种可能的解决方案:
- 将
sum
的类型更改为float
或double
。 - 将您的计算更改为:
sum += static_cast<int>(round( v[i] ));
请注意,您的编译器可能会警告将双精度截断为整数。注意编译器警告,它们通常表示存在错误。