R中的大数乘法

R中的大数乘法,r,R,我想知道如何计算R中的大值乘法。 R返回Inf 例如: 6.350218e+277*2.218789e+215 [1] Inf 让我进一步澄清这个问题: 考虑下面的代码和ExoFunc函数的结果: library(hypergeo) poch <-function(a,b) gamma(a+b)/gamma(a) n<-c(37 , 41 , 4 , 9 , 12 , 13 , 2 , 5 , 23 , 73 , 129 , 22 , 121 ) v<-c(90.2, 19

我想知道如何计算R中的大值乘法。 R返回Inf

例如:

6.350218e+277*2.218789e+215 
[1] Inf
让我进一步澄清这个问题: 考虑下面的代码和ExoFunc函数的结果:

library(hypergeo)
poch <-function(a,b) gamma(a+b)/gamma(a)
n<-c(37 , 41 , 4 , 9 , 12 , 13 , 2 , 5 , 23 , 73 , 129 , 22 , 121 )
v<-c(90.2, 199.3, 61, 38, 176.3, 293.6, 318.6, 328.7, 328.1, 313.3, 142.4, 92.9, 95.5)
DF<-data.frame(n,v)


outFunc<-function(k,w,r,lam,a,b) {
  ((((w*lam)^k) * poch(r,k) * poch(a,b) ) * hypergeo(r+k,a+k,a+b+k,-(w*lam)) )/(poch(a+k,b)*factorial(k))

}
如上所示,Outpunc返回Inf+NaNi以表示129和121的n值。 我一部分一部分地检查了代码部分,发现(wlam)^k poch(r,k)对这n个值的返回结果是Inf。我还使用Mathematica中的等效代码检查了我的代码,一切正常:

in:  out[indata[[All, 1]], indata[[All, 2]], 0.2, 1, 3, 1]

out: {0.00291133, 0.00304759, 0.0298866, 0.0135606, 0.0101601, 0.00892852, \
      0.0401658, 0.0194023, 0.00533601, 0.00168911, 0.000506457, \
      0.00557798, 0.000365445}

现在请让我知道我们如何解决这个问题,就像在Mathematica中一样简单。关于。

在不需要特殊库的base R中,您可以选择将两个数字转换为公共基数,然后将指数相加以获得最终结果:

> x <- log(6.350218e+277, 10)
> x
[1] 277.8028
> y <- log(2.218789e+215, 10)
> y
[1] 215.3461
> x + y
[1] 493.1489
>x
[1] 277.8028
>y y
[1] 215.3461
>x+y
[1] 493.1489
由于
10^x*10^y=10^(x+y)
,您的最终答案是
10^493.1489

请注意,此解决方案不允许实际存储R通常视为
INF
的数字。因此,在本例中,您仍然无法计算
10^493
,但您可以梳理出产品是什么。

>库(gmp)
> library(gmp)
> x<- pow.bigz(6.350218,277)
> y<- pow.bigz(2.218789,215)
> x*y

Big Integer ('bigz') :
[1] 18592826814872791919942226542714580401488894909642693257011204682802122918146288728149155739011270579948954646130492024596687919148494136290260248656581476275790189359808616520170359345612068099238508437236172770752199936303947098513476300142414338199993261924467166943683593371648
>x y x*y 大整数('bigz'): [1] 18592826814872791919942226542714580401488894909642693257011204682802122918146288728149155739011270579948954646130492024596687919148494136290260248656581476275790189359808616520170359345612068099238508437236172770752199936303947098513476300142414338199993261924467166943683593371648
首先,我推荐两种有用的阅读方法:和。这些都是相关的,因为通过一些“技巧”,你可以处理比你想象的更大的价值。例如,您对
poch
函数的定义很糟糕。这是因为分数可以简化很多,但计算机将首先计算分子,如果它溢出,结果将是无用的。这就是为什么
R
gamma
旁边提供了
lgama
函数的原因:它只计算
gamma
的对数,可以处理更大的值。因此,我们计算函数中每个因子的
log
,然后使用
exp
恢复预期值。试试这个:

#redefine poch properly
poch<-function(a,b) lgamma(a+b) - lgamma(a)
#redefine outFunc
outFunc<-function(k,w,r,lam,a,b) {
   exp((k*(log(w)+log(lam))+ poch(r,k) + poch(a,b) ) +  
   log(hypergeo(r+k,a+k,a+b+k,-(w*lam)))- poch(a+k,b)-lgamma(k+1))
}
#Now we go
outFunc(DF$n,DF$v,0.2, 1, 3, 1)
#[1] 0.0029113299+0i 0.0030475939+0i 0.0298866458+0i 0.0135605995+0i
#[5] 0.0101600732+0i 0.0089285243+0i 0.0401657947+0i 0.0194023182+0i
#[9] 0.0053360084+0i 0.0016891144+0i 0.0005064566+0i 0.0055779850+0i
#[13] 0.0003654449+0i
#正确重新定义poch

pochtry
gmp::mul.bigz(6.350218e+277,2.218789e+215)
或使用图书馆我很好奇:你为什么需要这个?通常,你会在对数范围内工作,并将结果报告为
exp(1135.517)
10^493.1489
@MahdiHadi关于你的最后一条评论,你应该努力提高阅读理解力。Khashaa的代码中没有
*
。@marcinebox我不同意。这个问题并没有显示出任何研究成果。也许值得指出的是,浮点精度起到了一定作用,但通常与这个数量级的数字无关。正如我童年时回忆的那样,无穷大加一仍然是无穷大:-)亲爱的Tim Biegeleisen,但R中10^493.1489的结果仍然是Inf,问题还没有解决@MahdiHadi R不是“编程方面的弱者”。您对计算机如何处理数字的理解较弱。Mathematica在默认情况下使用任意精度进行数值计算是不寻常的(unique?Python在整数计算中使用任意精度)。这不是一个好问题,但我很好奇是否还有其他主流计算机语言能做到这一点。当然还有
lfactorial
@Roland是的,因为
factorial
只是
gamma
(和
lgama
lfactorial
)的包装。非常感谢nicola,现在我需要用新的方程式来思考更多的问题。亲爱的nicola请用n检查你推荐的代码
#redefine poch properly
poch<-function(a,b) lgamma(a+b) - lgamma(a)
#redefine outFunc
outFunc<-function(k,w,r,lam,a,b) {
   exp((k*(log(w)+log(lam))+ poch(r,k) + poch(a,b) ) +  
   log(hypergeo(r+k,a+k,a+b+k,-(w*lam)))- poch(a+k,b)-lgamma(k+1))
}
#Now we go
outFunc(DF$n,DF$v,0.2, 1, 3, 1)
#[1] 0.0029113299+0i 0.0030475939+0i 0.0298866458+0i 0.0135605995+0i
#[5] 0.0101600732+0i 0.0089285243+0i 0.0401657947+0i 0.0194023182+0i
#[9] 0.0053360084+0i 0.0016891144+0i 0.0005064566+0i 0.0055779850+0i
#[13] 0.0003654449+0i