首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rmpfr包将bigq转换为mpfr

使用Rmpfr包将bigq转换为mpfr
EN

Stack Overflow用户
提问于 2013-01-13 18:50:59
回答 2查看 397关注 0票数 0

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

代码语言:javascript
复制
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时,one得到的近似值很差:

代码语言:javascript
复制
> x <- as.bigq(31,3)
> .bigq2mpfr(x)
1 'mpfr' number of precision  8   bits 
[1] 10.31 

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

代码语言:javascript
复制
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被认为是这样的。frexpZ()exp输出是二进制分解的指数:

代码语言:javascript
复制
> frexpZ(N)
$d
[1] 0.96875

$exp
[1] 5

> 0.96875*2^5
[1] 31

在这里我们得到了precB=8,然后结果与:

代码语言:javascript
复制
> mpfr(31, precBits=8)/mpfr(3, precBits=8)
1 'mpfr' number of precision  8   bits 
[1] 10.31

我的印象是,应该用2^precB取代precB,但我想得到一些建议:

代码语言:javascript
复制
> mpfr(31, precBits=8)/mpfr(3, precBits=2^8)
1 'mpfr' number of precision  256   bits 
[1] 10.33333333333333333333333333333333333333333333333333333333333333333333333333329
> mpfr(31, precBits=8)/mpfr(3, precBits=2^9)
1 'mpfr' number of precision  512   bits 
[1] 10.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333329
> mpfr(31, precBits=8)/mpfr(3, precBits=2^7)
1 'mpfr' number of precision  128   bits 
[1] 10.33333333333333333333333333333333333332
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-22 23:12:14

此问题已在较新版本的程序包中得到更正:

代码语言:javascript
复制
> x <- as.bigq(31,3)
> .bigq2mpfr(x)
1 'mpfr' number of precision  128   bits 
[1] 10.33333333333333333333333333333333333332
票数 1
EN

Stack Overflow用户

发布于 2013-01-15 00:02:53

我得到(注意我最初创建的不同):

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14302742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档