Взятие числовых частей в 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
Другие вопросы по тегам