C++处理double矩阵的简单函数出现意外返回值问题求解
问题原因
你的代码核心问题出在无符号整数的循环边界判断错误:
- 你定义的循环变量
j、i都是size_t类型,这是C++标准规定的无符号整数类型,取值范围永远≥0,所以循环判断条件j >= 0永远成立,不会正常退出循环。 - 当
j从0再执行减1操作时,会触发无符号整数下溢,变成size_t类型能表示的最大值,此时访问matrix[j]属于数组越界访问,是典型的未定义行为。你运行时刚好越界读到的内存值等于0.0,所以触发了if分支返回true,和你预期的逻辑不符。
修复方案
方案1:修改循环变量为有符号类型
直接把循环变量类型改为int(如果矩阵尺寸可能超过int最大值,可替换为ssize_t或int64_t等有符号大整数类型):
// 需额外引入 <cmath> 头文件使用 fabs 函数 bool remove1zero(std::vector<std::vector<double>> & matrix) { int dim = static_cast<int>(matrix.size()); for (int j = dim - 1; j >= 0; j--) for (int i = dim - 1; i >= 0; i--) // 补充浮点数相等判断的容错处理,避免精度误差导致判断错误 if (fabs(matrix[j][i]) < 1e-9) { matrix[j][i] = -2.0; return true; } return false; }
方案2:调整无符号数倒序循环写法
如果要保留size_t类型的循环变量,可以用C/C++常用的无符号倒序循环写法,避免下溢问题:
// 需额外引入 <cmath> 头文件使用 fabs 函数 bool remove1zero(std::vector<std::vector<double>> & matrix) { size_t dim = matrix.size(); for (size_t j = dim; j-- > 0; ) for (size_t i = dim; i-- > 0; ) if (fabs(matrix[j][i]) < 1e-9) { matrix[j][i] = -2.0; return true; } return false; }
额外注意事项
浮点数因为存在精度误差,直接用==判断是否等于0是不可靠的,建议判断数值的绝对值小于一个极小的阈值来实现近似相等判断。
内容的提问来源于stack exchange,提问作者edgystyle
相关产品推荐
相关产品推荐

