如何使我的功能具有更高的价值

时间:2018-07-29 11:51:38

标签: r digit

在R中,我正在编写此函数

ifun = function(m)  {
o=c()
for(k in 1:m) {
o[k]= prod(1:k)/ prod(2*(1:k)+1  )
}
o_sum=2*(1+sum(o)) # Final result   
print(o_sum)
}

我希望ifun()的值较高。例如

 sprintf("%.100f",ifun(170) ) 

提供以下输出:

[1] 3.141593
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

但是当我接受更高的价值时,它可以给我任何价值。例如

sprintf("%.100f",ifun(180) ) 

给我这个输出

[1] NaN
[1] "NaN"

如何重新编写代码,以便我可以将ifun用作较大的值? 另外,我使用此函数来近似pi,但对于

> ifun(x>50)

它一次又一次地给我相同的结果,并且不会使我的近似值更好。


编辑

我也尝试在Macin系列上使用该方法,我在R中写了这个

mac = function(m, approx=TRUE){   
o1 = as.bigq(NULL)   
o2 = as.bigq(NULL)
for(k in 1:m) {
k <- as.bigq(k)
     o1 = c(o1, 1/((2*k+1)*5^(2*k+1))  *(-1)^k)
     o2 = c(o2, 1/((2*k+1)*239^(2*k+1))  *(-1)^k)

   }   
  o_sum = 16*(1/5+sum(o1)) -4*(1/239+sum(o2))   
  if(approx){
     as.numeric(o_sum)   
  } else{
     o_sum   } }

 library(Rmpfr)  x <- mac(250, approx=FALSE)  mpfr(x,256)

这给了我一个奇怪的输出

> 1 'mpfr' number of precision  256   bits  [1]
> 3.1415926535897934 18913264129286527160857809883357101405

它只给我前16个正确的数字,不能给我更多。 这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

使用gmp。如果需要,它可以给出精确的结果作为有理数。

library(gmp)

ifun = function(m, approx=TRUE){
  o = as.bigq(NULL)
  for(k in 1:m) {
    r <- as.bigz(1:k)
    o = c(o, prod(r)/ prod(2*r+1 ))
  }
  o_sum = 2*(1+sum(o)) 
  if(approx){
    as.numeric(o_sum)
  }else{
    o_sum
  }
}

> ifun(4, approx=FALSE)
Big Rational ('bigq') :
[1] 976/315
> ifun(180)
[1] 3.141593

编辑

实际上要将确切的有理数转换为十进制数,最好使用Rmpfr库:

> library(Rmpfr)
> x <- ifun(250, approx=FALSE)
> mpfr(x,256)
1 'mpfr' number of precision  256   bits 
[1] 3.14159265358979323846264338327950288419716939937510582097494459230781640628613