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
を使用。
ありがとうございます!
'options(digits = 22)'を使ってRコードをもう一度実行します;-) – coatless
こんにちは! @coatlessご意見ありがとうございます。私はそれが次のエラーが返され、Rstudioでそのコードを実行する: '>オプション(数字= 22)' '' '>和(YY) [1] 0.019373457517486758 >和(YY2) [ 1] 0.019373457517486748'''実際に私は、RコードがRコードのように0以外の値を返すことを期待していました。私はRcppコードで間違いをしますか?どうもありがとうございました! –
があり精度の唯一の16桁の数字なので、最後の6はランダムである22で印刷することを伝える人々に聞いていません。 –