c++ - 在 float vector 中找到众数

标签 c++ vector statistics

我试图在包含 324 个浮点值的 vector 中找到众数平均值。

我的代码如下:

float max = vec.back();
float prev = max;
float mode = 0.0;
int maxcount = 0;
int currcount = 0;

for (const auto n : vec) {
    if (n == prev) {
        ++currcount;
        if (currcount > maxcount) {
            maxcount = currcount;
            mode = n;
        }
    } else {
        currcount = 1;
    }
    prev = n;
}

std::cout << mode << std::endl

这打印出模式为 0.75,这是错误的。

这里是所有的浮点值,它们来自一个 txt 文件所以请原谅格式:

0.61 0.61 0.61 0.62 0.62 0.62 0.62 0.62 0.62 0.62 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.63 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.64 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.65 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.66 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.67 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.68 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0.69 0。 69 0.69 0.69 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.72 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.73 0.74 0.74 0.74 0.74 0.74 0.74 0.74 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.76 0.76 0.76 0.76 0.76 0.76 0.76 0.76 0.76 0.77 0.77 0.77 0.77 0.77 0.77 0.77 0.78 0.78 0.78 0.78 0.78 0.78 0.78 0.78 0.78 0.78 0.79 0.79 0.79 0.79 0.79 0.79 0.79 0.79 0.79 0.79 0.79

Excel 显示众数为 0.65。为什么我的代码不会产生相同的结果?我需要改变什么?

非常感谢。

编辑:我通过调试发现 vec 中的值更像; 0.68000000000000005、0.69999999999999996,尽管有些仍然只有两位小数(0.64、0.74 等)。这可能是问题所在吗?我能为这个特定的计算结果取整吗?

最佳答案

问题可能是使用 float 进行比较。由于存储方式的不同, float 通常与它们的初始化值有少量不同。

不使用 n == prev,考虑在大于 machine precision 的一些小 epsilon 内进行比较(对于您希望运行此代码的任何机器)但小于任何两个数字之间的最小真实差异(看起来像 0.01)。所以你可以做

if (((n - prev) < EPSILON) && ((prev - n) < EPSILON)) { ...`

对于 float EPSILON = 0.000001,或者一个对您有意义的值。 另见 this question on comparing floats .值得注意的是,如果您的数据集变为更大或更小的数字,则理想的 epsilon 会发生变化。

即使您的代码中存在其他问题,您也可以考虑不再比较一般的 float 。

关于c++ - 在 float vector 中找到众数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407799/

相关文章:

c++ - CMake 无法找到一些图像库

r - 给定具有相同列数的向量,如何选择矩阵的元素?

python - 创建具有左偏概率分布的随机数

python - 如何解释热图(或一般情况)上的负相关性?

c++ - boost::program_options 忽略配置文件中的选项

c++ - 使用指针的 vector 移位

c++ - 如何二进制搜索结构 vector 并插入适当的索引

C++ 将 vector 拆分为 n 个 vector 的最佳方法

javascript - 使用 Mocha 和 Chai 在 JavaScript 中测试随机数函数

c++ - 更多 spirit 疯狂 - 解析器类型(规则与 int_parser<>)和元编程技术