Математически говоря, одно из этих чисел будет ок.ноль, а другой.Разница между вашими числами огромна, поэтому мне даже интересно, имеет ли это смысл.
Но, чтобы сделать это в целом, вы можете использовать идею из logspace_add
C-функции, которая находится под капотомR. Можно определить logxpy ( =log(x+y) )
, когда lx = log(x)
и ly = log(y)
как:
logxpy <- function(lx,ly) max(lx,ly) + log1p(exp(-abs(lx-ly)))
Что означает, что мы можем использовать:
> la1 <- 1000*log(0.1)
> la2 <- 1200*log(0.2)
> exp(la1 - logxpy(la1,la2))
[1] 5.807714e-162
> exp(la2 - logxpy(la1,la2))
[1] 1
Эта функция может вызываться рекурсивно какхорошо, если у вас есть больше номеров.Имейте в виду, 1 все еще 1, а не 1 минус 5.807...e-162
.Если вам действительно нужно больше точности, и ваша платформа поддерживает длинные двойные типы, вы можете написать все, например, на C или C ++, и вернуть результаты позже.Но если я прав, R может - на данный момент - иметь дело только с обычными удвоениями, поэтому в конечном итоге вы снова потеряете точность, когда будет показан результат.
РЕДАКТИРОВАТЬ:
чтобы сделать математику для вас:
log(x+y) = log(exp(lx)+exp(ly))
= log( exp(lx) * (1 + exp(ly-lx) )
= lx + log ( 1 + exp(ly - lx) )
Теперь вы просто берете наибольшее значение как lx, а затем вы получаете выражение в logxpy()
.
РЕДАКТИРОВАТЬ 2: Зачем тогда брать максимум?Легко убедиться, что вы используете отрицательное число в exp (lx-ly).Если lx-ly становится слишком большим, тогда exp (lx-ly) возвращает Inf.Это не правильный результат.exp (ly-lx) вернет 0, что позволяет получить гораздо лучший результат:
Скажем, lx = 1 и ly = 1000, затем:
> 1+log1p(exp(1000-1))
[1] Inf
> 1000+log1p(exp(1-1000))
[1] 1000