2017-05-21 17 views
0

UPDATE 前の例では、したがって、以下に示すように、私は単純な例を使用できるようにしてください、複雑である:ここで矛盾した結果

はRcppコードです:

#include <RcppArmadillo.h> 
#include <RcppArmadilloExtensions/sample.h> 
#include <Rmath.h> 
#include <Rcpp.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
using namespace Rcpp ; 
using namespace arma; 
using namespace std; 

// [[Rcpp::export]] 
double chooseC(double n, double k) { 
    return Rf_choose(n, k); 
} 
// [[Rcpp::export]] 
double function3(double n, double m, double beta) { 
    double prob; 
    NumericVector k(m); 
    NumericVector k_vec(m); 
    if(n<m){prob=0;} 
    else{ 
    if(chooseC(n,m)==R_PosInf){ 
     k=seq_len(m)-1; 
     k_vec= (n-k)/(m-k)*std::pow((1-beta),(n-m)/m)*beta; 
      prob=std::accumulate(k_vec.begin(),k_vec.end(), 1, std::multiplies<double>())*beta; 
    } 
    else{ 
     prob = beta * chooseC(n,m) * std::pow(beta,m) * std::pow((1-beta),(n-m)); 
    } 

    } 
    return(prob); 
} 
ここ

はRコードです:

function4 <- function (n , m , beta) 
{ 
    if (n < m) 
    { 
    prob <- 0.0 
    } 
    else 
    { 
    if (is.infinite(choose(n,m))){ 
     k<-0:(m-1) 
     prob <- beta *prod((n-k)/(m-k)*(1-beta)^((n-m)/m)*beta) 
    } 
    else{ 
     prob <- beta * choose(n,m) * beta^m * (1-beta)^(n-m) 
    } 
    } 
    prob 
} 

比較:

input<-619 
beta<-0.09187495 

x<-seq(0, (input+1)/beta*3) 
yy<-sapply(x,function(n)function3(n,input, beta=beta)) 
yy2<-sapply(x,function(n)function4(n,input, beta=beta)) 
sum(yy)=0 
sum(yy2)=1 

しかし、他の入力を有する:

input<-1 
beta<-0.08214248 

両方の結果は、sum(yy)=sum(yy2)=0.9865887、同じです。

私はRcppとRコードの間の一貫性のない精度を引き起こす可能性が他に何かわからない、Rcppコードでdoubleを使用。

ありがとうございます!

+0

'options(digits = 22)'を使ってRコードをもう一度実行します;-) – coatless

+0

こんにちは! @coatlessご意見ありがとうございます。私はそれが次のエラーが返され、Rstudioでそのコードを実行する: '>オプション(数字= 22)' '' '>和(YY) [1] 0.019373457517486758 >和(YY2) [ 1] 0.019373457517486748'''実際に私は、RコードがRコードのように0以外の値を返すことを期待していました。私はRcppコードで間違いをしますか?どうもありがとうございました! –

+0

があり精度の唯一の16桁の数字なので、最後の6はランダムである22で印刷することを伝える人々に聞いていません。 –

答えて

0

私はRcppコードを修正したと思うので、結果が非​​常に小さい値の場合、RcppとRコードの両方で同じ結果が得られます。解決策は以下のように示されている:

#include <RcppArmadillo.h> 
#include <RcppArmadilloExtensions/sample.h> 
#include <Rmath.h> 
#include <Rcpp.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace Rcpp ; 
using namespace arma; 
using namespace std; 

// [[Rcpp::export]] 
double chooseC(double n, double k) { 
    return Rf_choose(n, k); 
} 

// [[Rcpp::export]] 
double function3(double n, double m, double beta) { 
    double prob; 
    arma::vec k = arma::linspace<vec>(0, m-1, m); 
    arma::vec k_vec; 

    if(n<m){prob=0;} 
    else{ 
    if(chooseC(n,m)==R_PosInf){ 
     k_vec= (n-k)/(m-k)*pow((1-beta),(n-m)/m)*beta; 
     prob=arma::prod(k_vec)*beta; 
    } 
    else{ 
     prob = beta * chooseC(n,m) * pow(beta,m) * pow((1-beta),(n-m)); 
    } 

    } 
    return(prob); 
} 

このようにコードを記述することで高精度の矛盾を修正する理由しかし、私はまだ理解していません。 RcppRcppArmadilloはまだ私には黒い箱のように見えます。

関連する問題