On 14 March 2013 at 14:42, Aileen Lin wrote: | My C code: | //[[Rcpp::depends("Rcpp")]] | #include <Rcpp.h> | #include <iostream> | using namespace Rcpp; | | //[[Rcpp::export]] | NumericVector sigmutest(double pd, double rsq){ | double qpd = R::qnorm(pd, 0, 1, 1, 0); | double sgtemp = 0.2; | double sg = 0.3; | double eor = 1; | | double w = 0; | while (eor>=0.0001) { | sg = sgtemp; | w = pd * 0.4 / (R::pnorm((qpd - sqrt(rsq) * (-0.42) * sgtemp), | 0, 1, 1, 0)); | sgtemp = (-0.5) * w + 0.4; | std::cout << "sg " << sg << std::endl; | std::cout << "sgtemp " << sgtemp << std::endl; | eor = abs(sg - sgtemp); | | std::cout << "error " << eor << std::endl; | | } | NumericVector out(3); | out(0) = sg; | out(1) = sgtemp; | out(2) = eor; | return out; | } | | My R code: | | > Rcpp::sourceCpp('src/sbi.cpp') | > x <- sigmutest(0.0002327279, 0.1025499338) | sg 0.2 | sgtemp 0.219135 | error 0 | | | Does anyone know what is going on? Thanks.
abs() is a C function for int-on-int. So eor becomes 0. Use std::fabs() instead. Dirk | -- | Aileen L. | | View my Linkedin profile: http://au.linkedin.com/in/aileen2 | | | Being happy doesn't mean you're perfect. It just means you've decided to look | beyond the imperfections- K.B Indiana (age 14) | | | ---------------------------------------------------------------------- | _______________________________________________ | Rcpp-devel mailing list | Rcpp-devel@lists.r-forge.r-project.org | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel -- Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel