C ++ - 让频率加起来的好方法

时间:2017-05-15 13:10:27

标签: c++ double precision frequency

编辑:谢谢你的快速回答!
了解如何表示数字,以及为什么可以观察到这样的结果。我的问题是关于如何使它们加起来为1.0。

我有一个4个字母A,C,G和T的字母。
我计算了它们,因此有总字母数和每个人数。

unsigned int A_count; //initialized
unsigned int C_count; //initialized
unsigned int G_count; //initialized
unsigned int T_count; //initialized
//a bit hacky, enables floating point division
double total_count = A_count + C_count + G_count + T_count;

然后,我尝试计算他们的频率:

double A_frequency = A_count / total_count;
double C_frequency = C_count / total_count;
double G_frequency = G_count / total_count;
double T_frequency = T_count / total_count;

但这并不总是对我有用,因为频率之和可以大于1,我需要它完全等于1.0。

例如:

std::cout << "Result : " << A_frequency + C_frequency + G_frequency + T_frequency << std::endl;
Result : 1.000[...]01

<击> 我需要它来生成一个meme文件,如此处所述(MEME file format)。
可以在relevant part中读到:

<击>   

由于每行包含字母表中每个字母的概率,行中的概率必须总和为1.

正如@TonyK在评论中指出的那样,MEME文件本身并不需要总和恰好是1.0,尽管文档说的是。

但在我的情况下,meme文件只是被创建为另一个程序的输入,需要频率之和恰好为1.0。

有没有好/漂亮的方法呢?如果没有,为什么?

(这是我关于stackoverflow的第一篇文章,如果有问题,请告诉我,我会更正它,谢谢)

1 个答案:

答案 0 :(得分:1)

您可以使用存储分子(=单个字母的计数)和分子(=总计数)的分数类型。通过这种方式,您可以确保在累加频率后,您将获得1(=总计数/总计数)。

实际上我会考虑首先计算频率是否真的值得。您也可以只存储计数,并且仅在需要时将它们除以总计数。