在 R 中取数字部分(使用对数函数重新缩放小数字)
taking number parts in R (rescale small numbers using log function)
我想用日志函数表示以下数字:
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 首先计算内部表达式,然后应用给出 -Inf
而不是 -1381.511
的对数函数
我的问题是如何解决这个问题?我在想,也许有一个函数可以让我检索数字的指数部分?来自 log(2.5e-600) to log(2.5)-600*log(10)
的相同问题
Rs 通常的数字格式(双精度)会让你在这里留下 SOL,因为你写下的数字对于 R 已经等于 0。(在控制台中输入:'2.5e-600' 以获得 [1] 0
作为答案)
您可以查看 arbitrary precision arithmetic 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
对于这种特殊情况,您无需使用 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
我想用日志函数表示以下数字:
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 首先计算内部表达式,然后应用给出 -Inf
而不是 -1381.511
我的问题是如何解决这个问题?我在想,也许有一个函数可以让我检索数字的指数部分?来自 log(2.5e-600) to log(2.5)-600*log(10)
Rs 通常的数字格式(双精度)会让你在这里留下 SOL,因为你写下的数字对于 R 已经等于 0。(在控制台中输入:'2.5e-600' 以获得 [1] 0
作为答案)
您可以查看 arbitrary precision arithmetic 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
对于这种特殊情况,您无需使用 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