如何让我的函数取更高的值
How to get my function to take higher values
我在 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 个正确的数字,不能给我更多。
这可能是什么原因?
使用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
我在 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 个正确的数字,不能给我更多。 这可能是什么原因?
使用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