我希望乘以超过10K的概率估计值(0到1之间的值)。 我正在使用Ruby。我使用BigDecimal来存储像
这样的小数字prod = BigDecimal.new("1")
prod = prod * BigDecimal.new("#{ngramlm[key]}")
但经过几次迭代后,prod变为零。你能帮我解决一下如何将最终产品存放到产品中(这个数字非常接近零)!!
答案 0 :(得分:2)
您所描述的内容听起来像是使用日志概率(http://en.wikipedia.org/wiki/Log_probability)的典型案例。使用log(y)=log(x1)+log(x2)
代替y=x1*x2
(将乘法转换为对数概率的加法)将提高速度和数值稳定性。
答案 1 :(得分:0)
您可以使用本机Ruby Rational类。作为a rational number can be represented as a paired integer number; a/b (b>0).
e.g。
Rational(0.3) #=> (5404319552844595/18014398509481984)
Rational('0.3') #=> (3/10)
Rational('2/3') #=> (2/3)
0.3.to_r #=> (5404319552844595/18014398509481984)
'0.3'.to_r #=> (3/10)
'2/3'.to_r #=> (2/3)
0.3.rationalize #=> (3/10)
所以你的数字将被转换为有理数,你可以获得更大的精确度,因为理性的理性会给你理性。 E.g。
Rational(2, 3) * Rational(2, 3) #=> (4/9)
Rational(900) * Rational(1) #=> (900/1)
Rational(-2, 9) * Rational(-9, 2) #=> (1/1)
Rational(9, 8) * 4 #=> (9/2)
所以你基本上会处理分子和分母中整数的乘法,这是精确的。