为什么Python会默默地转换成0.0?

4
请看下面的代码,注意在0.0005**99时输出结果突然变成了0.0
In [1]: 0.0005**97                                                              
Out[1]: 6.31e-321

In [2]: 0.0005**98                                                              
Out[2]: 5e-324

In [3]: 0.0005**99                                                              
Out[3]: 0.0

In [4]: 0.0005**100                                                             
Out[4]: 0.0

我本以为会出现一个下溢错误(Underflow)或者某种提示,说明会发生这种情况。

我正在使用朴素贝叶斯算法编写垃圾邮件过滤器,在处理长篇消息时,像您在上面看到的计算是很常见的。虽然我可以添加一些数学变通方法,但我仍然认为这种“转换”为0.0会悄无声息地发生是有问题的。

我在Python 3.7.3中运行了上面的代码。


4
IEEE-754浮点数运算在下溢时通常会默默地发生。事实上,有一个标志可以在发生下溢时被设置,但是你几乎必须编写汇编语言来访问其中任何功能,才能更改其静默处理的默认行为。 - user2357112
1
浮点数运算存在不完美的情况,因此在某些时候误差会积累到足以将结果减少为0。您是否期望每次浮点数产生错误结果(即99%的时间)时都打印警告? - Aran-Fey
你提问的方式并没有明确指出你特别关注数字0。 - Aran-Fey
无论如何,这对于你的朴素贝叶斯算法来说是个问题,这表明你还没有学会需要用对数进行计算。请使用对数。 - user2357112
1
@Aran-Fey 这个问题说他们期望下溢,也就是关于零的问题,所以很明显他们特别询问这个。 - Kelly Bundy
显示剩余2条评论
1个回答

2
在Python中,所有的浮点数四舍五入都是静默进行的。在这种情况下,你试图表示的最接近的浮点数比大于0的最小浮点数更靠近0。正如一些评论所建议的那样,使用对数空间将有助于处理这些非常小的数字的表示。

1
请注意,下溢是与舍入不同的概念,对于Python来说,它把下溢视为舍入(即不是问题)而不是处理上溢时所采用的方法(即引发"OverflowError"异常而不是四舍五入到 "float('inf')")。 - kaya3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接