使用Rmpfr软件包将bigq转换为mpfr

时间:2013-01-13 10:50:59

标签: r floating-accuracy gmp

Rmpfr R包的帮助文档声称.bigq2mpfr()函数使用precB参数为NULL时正确表示所需的最小精度:

Description:

     Coerce from and to big integers (‘bigz’) and ‘mpfr’ numbers.

     Further, coerce from big rationals (‘bigq’) to ‘mpfr’ numbers.

Usage:

     .bigz2mpfr(x, precB = NULL)
     .bigq2mpfr(x, precB = NULL)
     .mpfr2bigz(x, mod = NA)

Arguments:

       x: an R object of class ‘bigz’, ‘bigq’ or ‘mpfr’ respectively.

   precB: precision in bits for the result.  The default, ‘NULL’, means
          to use the _minimal_ precision necessary for correct
          representation.

然而,当转换31/3时会得到一个不正确的近似值:

> x <- as.bigq(31,3)
> .bigq2mpfr(x)
1 'mpfr' number of precision  8   bits 
[1] 10.31 

通过查看.bigq2mpfr()函数,我们可以看到详细的过程:

N <- numerator(x)
D <- denominator(x)
if (is.null(precB)) {
    eN <- frexpZ(N)$exp
    eD <- frexpZ(D)$exp
    precB <- eN + eD + 1L
}
.bigz2mpfr(N, precB)/.bigz2mpfr(D, precB)

首先,我不明白为什么precB采取如下措施。 exp的{​​{1}}输出是二进制分解中的指数:

frexpZ()

我们得到> frexpZ(N) $d [1] 0.96875 $exp [1] 5 > 0.96875*2^5 [1] 31 ,然后结果与:

相同
precB=8

我认为我应该用> mpfr(31, precBits=8)/mpfr(3, precBits=8) 1 'mpfr' number of precision 8 bits [1] 10.31 取代precB,但我想就此提出一些建议:

2^precB

2 个答案:

答案 0 :(得分:1)

我明白了(注意我最初创作的不同之处):

Rgames> fooq<-as.bigq(31/3)
Rgames> fooq
Big Rational ('bigq') :
[1] 5817149518686891/562949953421312
Rgames> .bigq2mpfr(fooq)
1 'mpfr' number of precision  104   bits 
[1] 10.3333333333333339254522798000835

所有这些都强烈告诉我,bigq数字的精度实际上是零小数位,即“31”和“3”中的每一个都具有该精度。因此,您的mpfr转换在给出一个小数位精度的结果时非常正确。

答案 1 :(得分:1)

在较新版本的软件包中已对此进行了更正:

> x <- as.bigq(31,3)
> .bigq2mpfr(x)
1 'mpfr' number of precision  128   bits 
[1] 10.33333333333333333333333333333333333332