C++中如何将一维数组与二维数组的值进行比较?
浮点数数组比较匹配问题解决方法
问题说明
需要将一维数组numbers的每个值与二维数组gain的所有值逐一比较,返回匹配值对应的任务ID(job id)和处理器ID(processor id)。但直接使用==进行浮点数相等判断时,即使视觉上数值相同,也无法进入判断分支,甚至硬编码指定下标比较也无效。
核心原因
浮点数在二进制存储和计算过程中存在精度误差(例如0.1无法被二进制精确表示),导致两个理论上相等的浮点数,实际存储的二进制值存在微小差异,直接用==判断会认为它们不相等。
解决方案
放弃直接使用==判断浮点数相等,改用误差阈值比较法:设定一个极小的阈值(如1e-6,可根据实际精度需求调整),判断两个浮点数的绝对差值是否小于该阈值,以此认定它们“相等”。
同时修正原循环逻辑,确保numbers的每个元素都与gain的所有元素进行比较(原代码仅比较numbers[i]与gain[i][j],未覆盖所有组合)。
修正后的代码
#include <cmath> // 用于std::abs float gain[21][3]; // job_count = 21,processor_count = 3 float numbers[MAX]; const int job_count = 21; const int processor_count = 3; const float EPS = 1e-6; // 误差阈值,可根据需求调整 // 输出排序后的numbers数组 cout << "Sorted Numbers:" << endl; for (int i = 0; i < job_count; i++) { cout << numbers[i] << endl; } // 初始化gain数组 for (int i = 0; i < job_count; i++) { for (int j = 0; j < processor_count; j++) { if ((j + 1) == (jobs[i].processor_exec + 1)) { cout << " " << endl; } else { gain[i][j] = jobs[i].criticality * (1 - (1 - jobs[i].reliability) * (1 - jobs[i].processors[j].new_reliability)) - jobs[i].criticality * jobs[i].reliability; } } } // 遍历numbers所有元素,与gain所有元素比较 for (int k = 0; k < job_count; k++) { float target = numbers[k]; for (int i = 0; i < job_count; i++) { for (int j = 0; j < processor_count; j++) { // 跳过未初始化的gain元素(对应processor_exec的情况) if ((j + 1) == (jobs[i].processor_exec + 1)) { continue; } // 用误差阈值判断相等 if (std::abs(target - gain[i][j]) < EPS) { cout << target << " 匹配成功:任务ID " << i + 1 << ",处理器ID " << j + 1 << endl; } } } }
注意事项
- 阈值
EPS的取值需根据业务精度需求调整:如果是高精度计算可设为1e-9,普通场景1e-6足够。 - 若使用C++标准库,可结合
<numeric_limits>获取类型对应的最小误差,但自定义阈值更灵活可控。
内容的提问来源于stack exchange,提问作者Sreyashi Mukherjee
相关产品推荐
相关产品推荐

