Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何让我的函数取更高的值_R_Digit - Fatal编程技术网

R 如何让我的函数取更高的值

R 如何让我的函数取更高的值,r,digit,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) ) sprintf("%.100f",ifun(180) ) 给出此输出: [1] 3.141593 [1

在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) ) 
sprintf("%.100f",ifun(180) ) 
给出此输出:

[1] 3.141593
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
但当我取更高的值时,它可以给我任何值。比如说

 sprintf("%.100f",ifun(170) ) 
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)
它只给我前16个正确数字,不能给我更多。 这是什么原因呢

使用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
  }
}
编辑 实际上,要将精确的有理数转换为十进制数,最好使用Rmpfr库:


谢谢你的回答。ifunx很好地逼近pi,但是对于大于50的x,我只是一次又一次地得到相同的值,即:>sprintf%.50f,ifun500[1]3。14159265358979311599796346854418516159057617187500@OlePetersen也许一个更好的近似是不可能的?这是相当惊人的!!谢谢也用16*1/as.bigz5+sumo1-4*sumo2+1/as.bigz239替换o_总和。否则,1/239不会被评估为精确的有理数。我已经检查过了,结果现在至少正确到50位。@Olepersen尼斯。顺便说一句,你可能会感兴趣。
> library(Rmpfr)
> x <- ifun(250, approx=FALSE)
> mpfr(x,256)
1 'mpfr' number of precision  256   bits 
[1] 3.14159265358979323846264338327950288419716939937510582097494459230781640628613