2010-02-18 14 views
4

我有两个分数列表;使用logarthms进行算术以避免数值下溢的问题

A = [ 1/212, 5/212, 3/212, ... ]

B = [ 4/143, 7/143, 2/143, ... ]

如果我们定义A' = a[0] * a[1] * a[2] * ...B' = b[0] * b[1] * b[2] * ...

我想计算的A'/B'值,

我的麻烦是在B都是很长,每个值很小,因此在计算产品非常引起数值下溢很快......

我了解,通过对数把该产品变成一个和可以帮助我确定其中以A“或B”大于

max(log(a[0])+log(a[1])+..., log(b[0])+log(b[1])+...)

,但我需要的实际比例....

我迄今为止最好的办法是保持数表示为分数,即A = [ [1,212], [5,212], [3,212], ... ]和实现自己的算法,但它变得笨拙,我有一种感觉有是一种简单的对数方式,我只是缺少了......

A和B的分子不是来自一个序列。为了这个问题的目的,它们可能是随机的。如果它有助于A中所有值的分母都相同,那么所有B的分母都是一样的。

任何想法都是最受欢迎的!

回答

4

你可以计算出它在一个稍微不同的顺序:如果你想保持它在对数,记住,A/B对应于日志中

A'/B' = a[0]/b[0] * a[1]/b[1] * a[2]/b[2] * ... 
+0

太棒了!这应该很好。我看不到树林里的树林。 – 2010-02-18 10:40:34

+0

很好的答案。你击败了我:) – 2010-02-18 10:42:46

1

- 登录B,所以以后你已经总结了A和B的对数,你可以用max(logsumA,logsumB)-min(logsumA,logsumB)来指数化你的日志基数,找到大小比值。

+0

感谢这一个。由于其他原因(因为这是一个更大的图片的一部分),我有动力保持原木。干杯! – 2010-02-18 11:23:12

0

删除分子和分母,因为它们对于整个序列是相同的。计算每个元素的分子比率(而不是@Mark的建议),最后将结果乘以B的分母/ A的分母的正确的权力。

或者,如果在计算而分子或分母的权力,类似的产品威胁整数溢出:

A'/B' = (numerator(A[0])/numerator(b[0]))*(denominator(B)/denominator(A) * ... 

我可能已经得到了一些馏分倒置,但我猜你可以弄明白吗?

+0

是的有道理。 – 2010-02-18 11:11:01