我使用Naive Bayes分类器创建了一个检测垃圾邮件的应用程序。
在估计某些概率时,结果是非常小的数字,因此java返回零(0.0)。
变量声明为float。 Java如何处理像6.9e-232这样的非常小的数字?
答案 0 :(得分:4)
从float
更改为double
。在精度降低之前,这将使您的数字降至约2.2e-308。
此外,重新考虑是否需要处理这么小的数字。如果事物的概率是6.9e-232,那么它在你的一生中不太可能发生。
答案 1 :(得分:0)
即使您从float
转到double
,乘以许多“小”数字也会最终下降到零。而是使用对数进行乘法。
即,由于log(a * b)= log(a)+ log(b),计算a * b * c * ... * z的乘积为
product = exp(log(a) + log(b) + log(c) + ... + log(z))
这可以保护您免受下溢。
答案 2 :(得分:0)
最小的浮点双精度数,等于:2 ^( - 1074)。这大约等于:4.94×10 ^( - 324)。由于您提到使用浮点数而不是双精度数,因此最小的单精度浮点数为:2 ^( - 382),大约等于:1.01×10 ^( - 115)。因此,如果您的应用程序断定概率小于该值,那么您的计算中可能存在错误,而不是数字本身。