Взятие числовых частей в R (масштабирование небольших чисел с использованием функции log)
Я хочу представить следующее число, используя функцию журнала:
2.5e-600/1.7e-500
вот что я сделал на бумаге, и что я хотел бы автоматизировать на R для любого заданного числа:
log(2.5e-600/1.7e-500) = log(2.5e-600)-log(1.7e-500)
= log(2.5)-600*log(10) - log(1.7) + 500*log(10)
= -229.8728
Тем не менее, я думаю, что на R не будет так просто идти от log(10^-600) to -600*log(10)
, Поскольку R сначала вычисляет внутреннее выражение, затем применяет функцию log, которая дает -Inf
вместо -1381.511
Мой вопрос, как я могу исправить эту проблему? Я думаю, что, возможно, есть функция, которая позволила бы мне получить экспонентную часть числа? тот же вопрос для перехода от log(2.5e-600) to log(2.5)-600*log(10)
2 ответа
Для этого особого случая вы можете сделать это довольно просто, не используя mpfr
:
x1 <- "2.5e-600"
x2 <- "1.7e-500"
Разделите значение на мантиссу и экспоненту (log10):
get_num <- function(x) {
as.numeric(strsplit(x,"e")[[1]])
}
val1 <- get_num(x1)
val2 <- get_num(x2)
Теперь возьмите отношение мантисс (log(v1)-log(v2)), но вычтите показатели:
log(val1[1])-log(val2[1])+log(10^(val1[2]-val2[2]))
## [1] -229.8728
Обычный числовой формат Rs (double) оставит вас здесь SOL, потому что числа, которые вы записываете, уже равны 0 для R. (Введите его в консоли: "2.5e-600", чтобы получить [1] 0
как ответ)
Вы можете взглянуть на арифметические пакеты произвольной точности для R. Быстрый поиск в Google привел к https://cran.r-project.org/web/packages/Rmpfr/vignettes/Rmpfr-pkg.pdf
> log(mpfr("2.5e-300")/mpfr("1.7e-500"))
1 'mpfr' number of precision 20 bits
[1] 460.90283
Изменить: теперь, когда представление ясно, по-прежнему использовать mpfr
как это:
N <- mpfr(representable_part) * mpfr("1e-308")^reduction_number
Например
> mpfr(2.5) * mpfr("1e-308")^13
1 'mpfr' number of precision 17 bits
[1] 2.500098e-4004