0

RmpfrR パッケージのヘルプ ドキュメントでは、引数が次.bigq2mpfr()の場合、関数は正しい表現に必要な最小限の精度を使用すると主張しています。precBNULL

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出力は、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

むしろ次のものに置き換える必要があるという印象を受けていますprecB2^precB、それについていくつかのアドバイスを得たいと思います。

> 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
4

2 に答える 2

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桁の精度で結果が得られるという点で、変換は非常に正確です。

于 2013-01-14T16:02:53.073 に答える