4

分数のリストが 2 つあります。

いう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' のどちらが大きいかを判断するのに役立つことを理解しています

すなわちmax( log(a[0])+log(a[1])+..., log(b[0])+log(b[1])+... )

しかし、私は実際の比率が必要です....

これまでの私の最善の策は、数値表現を分数として保持することです。つまりA = [ [1,212], [5,212], [3,212], ... ]、独自の算術演算を実装しますが、不器用になり、欠けている対数の(単純な)方法があると感じています....

A と B の分子は数列に由来しません。この質問の目的のために、それらはランダムである可能性もあります。B のすべての分母と同様に、A のすべての値の分母が同じになるのに役立つ場合。

どんなアイデアでも大歓迎です!

マット

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 が対数 A - 対数 B に対応することを覚えておいてください。したがって、A と B の対数を合計した後、対数をべき乗することで大きい方と小さい方の比率を見つけることができます。 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 に答える