У меня есть два списка фракций;
скажи 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' / (A'+B')
и B' / (A'+B')
Моя проблема в том, что A и B оба довольно длинные, и каждое значение маленькое, поэтому вычисление продукта очень быстро приводит к численному недостатку...
Я понимаю, что преобразование произведения в сумму с помощью логарифмов может помочь мне определить, какой из A' или B' больше
ie max( log(a[0])+log(a[1])+..., log(b[0])+log(b[1])+... )
и что с помощью журналов я могу рассчитать значение A' / B'
, но как мне это сделать A' / A'+B'
Мой лучший выбор на сегодняшний день - сохранить представления чисел в виде дробей, то есть A = [ [1,212], [5,212], [3,212], ... ]
, и реализовать мою собственную арифметику, но она становится неуклюжей, и у меня есть ощущение, что есть (простой) способ логарифмов, который я просто отсутствует ....
Числители для A и B не берутся из последовательности. Они также могут быть случайными для целей этого вопроса. Если это поможет, знаменатели для всех значений в A будут одинаковыми, как и все знаменатели для B.
Приветствуются любые идеи!
(ps. Я задал аналогичный вопрос 24 часа назад относительно соотношения A'/B'
, но на самом деле это был неправильный вопрос. Я на самом деле после A'/(A'+B')
. Извините, моя ошибка. )