R 的高精度求和涉及二项式系数和对数
High precision sum with R involving binomial coefficients and logs
我正在尝试获取从二项式系数(非常大的整数)和对数(小实数)的乘积中获得的项的总和,每个项都有交替的符号。
例如:
library(Rmpfr)
binom <- function(n,i) {factorial(n)/(factorial(n-i)*factorial(i))}
i <- 30
n <-60
Ui <- rep(0,i)
for (k in (0:(i-1))) {
Ui[k+1] <- (-1)^(i-1-k) * binom(i-1,k)/(n-k) * log(n-k)
}
U <- sum(mpfr(Ui, 1024))
returns 7.2395....e-10
,与Mathematica返回的实际响应相差甚远,即-5.11...e-20
.
如何使总和准确?我手动检查了 Ui 并且所有的数字看起来都非常准确。
编辑
这是计算相同总和的 Mathematica 代码。它适用于整数,只有在总和结束后才转换为实数。我增加了报告的小数位数。
这是什么原因?
最后,我需要得到通过类似计算得到的两个数的比值。当两个数字相差几个数量级时,所获得的比率简直无法预测。
您需要在整个计算过程中使用 mpfr
个对象,而不仅仅是求和:
library(Rmpfr)
i <- 30
n <- 60
k <- 0:(i - 1)
nk <- mpfr(n - k, 128)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 128 bits
#> [1] -5.110333215290518581300810256453669394729e-20
nk <- mpfr(n - k, 256)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 256 bits
#> [1] -5.110333215285320173235309727002720346864555872897902728222060861935229197560667e-20
nk <- mpfr(n - k, 512)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 512 bits
#> [1] -5.1103332152853201732353097270027203468645558728979134452318939958128833820370490135678222208577277855238767473116630391351888405531035522832949562601913591e-20
我正在尝试获取从二项式系数(非常大的整数)和对数(小实数)的乘积中获得的项的总和,每个项都有交替的符号。
例如:
library(Rmpfr)
binom <- function(n,i) {factorial(n)/(factorial(n-i)*factorial(i))}
i <- 30
n <-60
Ui <- rep(0,i)
for (k in (0:(i-1))) {
Ui[k+1] <- (-1)^(i-1-k) * binom(i-1,k)/(n-k) * log(n-k)
}
U <- sum(mpfr(Ui, 1024))
returns 7.2395....e-10
,与Mathematica返回的实际响应相差甚远,即-5.11...e-20
.
如何使总和准确?我手动检查了 Ui 并且所有的数字看起来都非常准确。
编辑
这是计算相同总和的 Mathematica 代码。它适用于整数,只有在总和结束后才转换为实数。我增加了报告的小数位数。
这是什么原因?
最后,我需要得到通过类似计算得到的两个数的比值。当两个数字相差几个数量级时,所获得的比率简直无法预测。
您需要在整个计算过程中使用 mpfr
个对象,而不仅仅是求和:
library(Rmpfr)
i <- 30
n <- 60
k <- 0:(i - 1)
nk <- mpfr(n - k, 128)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 128 bits
#> [1] -5.110333215290518581300810256453669394729e-20
nk <- mpfr(n - k, 256)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 256 bits
#> [1] -5.110333215285320173235309727002720346864555872897902728222060861935229197560667e-20
nk <- mpfr(n - k, 512)
(U <- sum((-1)^(i-1-k)*choose(i-1,k)/(nk)*log(nk)))
#> 1 'mpfr' number of precision 512 bits
#> [1] -5.1103332152853201732353097270027203468645558728979134452318939958128833820370490135678222208577277855238767473116630391351888405531035522832949562601913591e-20