【问题标题】:How to get my function to take higher values如何让我的函数获取更高的值
【发布时间】:2018-07-29 11:51:38
【问题描述】:

在 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 个正确数字,它不能给我更多。 这可能是什么原因?

【问题讨论】:

    标签: r digit


    【解决方案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
    

    【讨论】:

    • 感谢您的回答。 ifun(x) 很好地近似 pi,但是对于大于 50 的 x,我只是一遍又一遍地得到相同的值,即:> sprintf("%.50f", ifun(500)) [1] "3.14159265358979311599796346854418516159057617187500"
    • @OlePetersen 也许不可能有更好的近似值?
    • 这太棒了!!谢谢!
    • 还将o_sum 替换为16*(1/as.bigz(5)+sum(o1)) - 4*(sum(o2)+1/as.bigz(239))。否则 1/239 不会被评估为精确的有理数。我已经检查过,结果现在(至少)最多 50 位是正确的。
    • @OlePetersen 不错。顺便说一句,您可能对this blog article 感兴趣。
    猜你喜欢
    • 2019-04-19
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多