我想解决的问题是以下函数的无限总和:
对于总和,我使用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
必须有一些我不太懂的东西。有人为这个问题找到了更好的解决方案,还是有人可以帮我解决上述问题?谢谢你的帮助!
答案 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)比这更精确,所以你不应该期望它们是相同的。