在 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
什么?!!!!!
由于您的 sum 变量是一个整数,因此在对向量中不是整数的元素求和时,您可能无法获得预期的结果。
如果您的元素的值为0.999999999
而不是1.00000
则打印它们可以四舍五入为1.00000
但是当您将它们添加到整数时,该值将被截断为 0。
从提供的输出来看,除了最后一个大于或等于 1 的值外,所有值都小于1
。
有两种可能的解决方案:
- 将
sum
类型更改为float
或double
。 - 将计算更改为:
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 */
相关文章:
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 类C++中的函数问题(LNK2019和LNK1120错误)
- 删除映射和分割错误中的一个过去结束元素
- 使用 char* 存储数据和产生的错误
- 编译器指出结构和 int 说明的错误 2059
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- GCC 警告和 gcc 错误消息之间的区别
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- Arduino Si7021 温度和湿度传感器代码中的错误
- 奇怪的 G++ 错误,带有关于左值和赋值的简单代码
- 不明确的错误重载运算符<<QdataStream 子类和个人类
- 重载赋值运算符函数和复制构造函数中的错误
- 带有指向成员函数的指针的模板 =VC++ 2017 和 gcc 5.1 的>不同的错误消息
- 将 Android 上的错误与 OpenCV 3.4.0 和 NDK 链接
- 递归除法和二分搜索中的错误
- 贝尔曼-福特算法中的 c++ 和分割错误 11
- LNK2019和LNK1120错误,未解析的外部和未解析的符号
- 在不合格的呼叫上,Clang和GCC上的错误
- 模板朋友类和的C++错误