4

我有两个分数列表;

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',

我的问题是 A 和 B 都很长,每个值都很小,所以计算乘积会很快导致数值下溢......

我了解通过对数将乘积转化为总和可以帮助我确定 A' 或 B' 中的哪个更大

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

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

迄今为止,我最好的选择是将数字表示形式保留为分数,即A = [ [1,212], [5,212], [3,212], ... ]实现我自己的算术,但它变得笨拙,我觉得我只是缺少一种(简单的)对数方式......

A 和 B 的分子不是来自序列。出于这个问题的目的,它们也可能是随机的。如果它有助于 A 中所有值的分母相同,则 B 中的所有分母也相同。

欢迎任何想法!

4

3 回答 3

4

您可以按稍微不同的顺序计算它:

A' / B' = a[0] / b[0] * a[1] / b[1] * a[2] / b[2] * ...
于 2010-02-18T10:22:52.650 回答
1

如果要保持对数,请记住 A/B 对应于 log A - log B,因此在将 A 和 B 的对数相加后,您可以通过对 log 取幂来找到较大与较小的比率以 max(logsumA,logsumB)-min(logsumA,logsumB) 为基数。

于 2010-02-18T10:46:26.043 回答
0

去掉分子和分母,因为它们对于整个序列是相同的。逐个元素计算分子的比率(而不是像@Mark 建议的那样),最后将结果乘以 B 分母/A 分母的右幂。

或者,如果这在计算分子或分母幂的乘积时威胁到整数溢出,例如:

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

我可能把一些分数颠倒了,但我想你能弄清楚吗?

于 2010-02-18T10:46:49.367 回答