我开发了一个应用程序来检测垃圾邮件,使用朴素贝叶斯分类器。
在估计某些概率时,结果是非常小的数,因此java返回零(0.0)。
变量被声明为浮点数。Java如何处理6.9e-232这样的非常小的数字?
发布于 2014-02-07 18:45:42
即使从float到double,将许多“小”数字相乘最终也会减少到零。用对数代替乘法。
也就是说,由于log(a*b) = log(a)+log(b),所以计算a*b*c*.*z的乘积为
product = exp(log(a) + log(b) + log(c) + ... + log(z))这会保护你不受地下水流的影响。
发布于 2014-02-07 18:55:58
从float转换为double。这将使您的数字下降到大约2.2e-308之前,精度下降。
另外,重新考虑是否需要处理这么小的数字。如果某事的概率是6.9e-232,那么它不太可能发生在你的有生之年。
发布于 2014-02-07 18:48:16
最小的浮点双精度数字,等于: 2^(−1074)。这大约等于: 4.94×10^(−324)。由于您提到使用浮点数而不是双精度浮点数,最小的单精度浮点数是: 2^(-382),大约等于: 1.01×10^(-115)。因此,如果您的应用程序得出的概率小于该概率,那么您的计算中可能有错误,而不是数字本身。
https://stackoverflow.com/questions/21635370
复制相似问题