我刚刚修复了以下代码中的一个有趣的错误,但我不确定我采取的方法是最好的:
p = 1
probabilities = [ ... ] # a (possibly) long list of numbers between 0 and 1
for wp in probabilities:
if (wp > 0):
p *= wp
# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
result = math.log(p)
由于结果不需要精确,我通过保留最小的非零值来解决这个问题,如果 p 变为 0,就使用该值。
p = 1
probabilities = [ ... ] # a long list of numbers between 0 and 1
for wp in probabilities:
if (wp > 0):
old_p = p
p *= wp
if p == 0:
# we've gotten so small, its just 0, so go back to the smallest
# non-zero we had
p = old_p
break
# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
result = math.log(p)
这种方法可行,但对我来说有点笨拙。我不经常进行这种数值编程,并且不确定这是否是人们使用的修复方式,或者是否有更好的选择。