0

我想使用 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)

4

2 回答 2

2

Rs 通常的数字格式(双精度)将把你留在这里,因为你写下的数字已经等于 R 的 0。(在控制台中输入:'2.5e-600'[1] 0作为答案)

您可以查看R 的任意精度算术包。快速谷歌搜索带来了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
于 2016-08-11T15:25:39.977 回答
1

对于这种特殊情况,您可以非常直接地完成此操作,而无需使用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
于 2016-08-11T16:57:48.993 回答