R:使用Rmpfr / gmp库对x> 170的因子(x)

时间:2014-09-11 15:30:04

标签: windows r factorial

我想解决的问题是以下函数的无限总和:

enter image description here

对于总和,我使用FTOL判定标准。在z变得非常大之前,整个术语不会产生任何问题。我希望z的最大值大约为220.正如你所看到的那样,第一个项在Factorial(221)周围有最大值,因此必须绕过因子(500),直到达到确定标准。在发现此问题后,我不想更改整个代码(因为它只是一小部分)并尝试使用library('Rmpfr') and library('gmp')。问题是我没有得到我想要的东西。虽然乘法通常有效,但减法因较高值而失败:

这有效

> factorialZ(22)-factorial(22)
Big Integer ('bigz') :
[1] 0

但这失败了:

> factorialZ(50)-factorial(50)
Big Integer ('bigz') :
[1] 359073645150499628823711419759505502520867983196160

我试过的另一种方式:

> gamma(as(10,"mpfr"))-factorial(9)
1 'mpfr' number of precision  128   bits 
[1] 0

> gamma(as(40,"mpfr"))-factorial(39)
1 'mpfr' number of precision  128   bits 
[1] 1770811808798664813196481658880

必须有一些我不太懂的东西。有人为这个问题找到了更好的解决方案,还是有人可以帮我解决上述问题?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

我认为您错误地理解了factorialZ(x)-factorial(x)中的优先级。第二个词factorial(x)计算之前将其转换为bigz以与第一个词组合。

您必须使用bigz兼容功能在2 ^ 64(或其他任何设备,具体取决于您的计算机)范围之外创建任何整数。

答案 1 :(得分:1)

50!在2 ^ 214和2 ^ 215之间,因此最接近的可表示数字相距2 ^(214-52)。 R中的factorial基于Lanczos近似,而factorialZ正在精确计算它。答案在机器精度范围内:

> all.equal(as.numeric(factorialZ(50)), factorial(50))
[1] TRUE

你不理解的部分是浮点数和它的局限性。浮点数只能达到~15位精度。 factorialZ(50)比这更精确,所以你不应该期望它们是相同的。