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 は最初に内部式を評価するため、-Inf代わりにlog 関数を適用します。-1381.511

私の質問は、どうすればその問題を解決できますか? 数値の指数部分を取得できる関数があるのではないかと考えていますか? から行くための同じ質問log(2.5e-600) to log(2.5)-600*log(10)

4

2 に答える 2

2

R の通常の数値形式 (double) では、ここに SOL が残ります。これは、書き留めた数値が R に対して既に 0 に等しいためです (コンソールに入力してください: '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
于 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 に答える