r - 使用 R 进行高精度求和,涉及二项式系数和对数

标签 r precision logarithm binomial-coefficients

我试图获得从二项式系数(非常大的整数)和对数(小实数)的乘积获得的项的总和,每个项都有交替的符号。

例如:

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))

返回7.2395....e-10,与Mathematica返回的实际响应相差甚远,即-5.11...e-20 .

怎样才能使总和准确?我手动检查了 Ui,所有的数字看起来都很准确。

编辑

这是计算相同总和的 Mathematica 代码。它适用于整数,并且只有在总和结束后才转换为实数。我增加了报告的小数位数。

Mathematica code

原因是什么?

最后,我需要得到通过类似计算得到的两个数字的比率。当两个数字相差几个数量级时,所获得的比率根本无法预测。

最佳答案

您需要在整个计算过程中使用 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

关于r - 使用 R 进行高精度求和,涉及二项式系数和对数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70147562/

相关文章:

r - ggplot2 的文件压缩选项

R:再次出现数字时如何获取Row sequential ID?

r - 如何删除数据框中列名的特定部分?

c - 为什么 sqrt() 分配的这个 float 没有精度损失?

python - 使用Python代码计算离散对数的问题

r - 使用 awesomeIcons 更改图标颜色

math - float 学坏了吗?

scala - 为什么 0.29999999999999998 转换为 0.3?

matlab - 修剪数据以便在对数对数图上更好地查看 - Matlab

java.lang.Math.log被内部调用取代,为什么不是java.lang.Math.exp()?