Java如何代表非常小的分数?

时间:2014-02-07 18:41:04

标签: java floating-point

我使用Naive Bayes分类器创建了一个检测垃圾邮件的应用程序。

在估计某些概率时,结果是非常小的数字,因此java返回零(0.0)。

变量声明为float。 Java如何处理像6.9e-232这样的非常小的数字?

3 个答案:

答案 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)。因此,如果您的应用程序断定概率小于该值,那么您的计算中可能存在错误,而不是数字本身。