[Rcpp-devel] Problems wit rlnorm

Dirk Eddelbuettel edd at debian.org
Mon May 30 01:26:25 CEST 2011


David,

On 29 May 2011 at 18:02, Dirk Eddelbuettel wrote:
| I am a little stumped too. I also failed to get it to work. I will take
| another look later --- this may in fact be a bug.

It _was_ a bug and seemingly nobody but you ever tried rnlorm :)  

There was a silly typo bug inasmuch as the header guard used _norm_ not
_lnorm_ and with the other term already defined, this header file was never
included.  We also need a few more fixed making exp() explicitly call the C
math library one, and correcting a typo.  

If you are comfortable applying a diff, try this one from rev3038.

Cheers,  Dirk


Index: inst/include/Rcpp/stats/random/rlnorm.h
===================================================================
--- inst/include/Rcpp/stats/random/rlnorm.h	(revision 3029)
+++ inst/include/Rcpp/stats/random/rlnorm.h	(working copy)
@@ -19,8 +19,8 @@
 // You should have received a copy of the GNU General Public License
 // along with Rcpp.  If not, see <http://www.gnu.org/licenses/>.
 
-#ifndef Rcpp__stats__random_norm_h
-#define Rcpp__stats__random_norm_h
+#ifndef Rcpp__stats__random_lnorm_h
+#define Rcpp__stats__random_lnorm_h
 
 namespace Rcpp {
 	namespace stats {
@@ -32,7 +32,7 @@
 				meanlog(meanlog_), sdlog(sdlog_) {}
 	
 			inline double operator()() const {
-				return exp( meanlog + sdlog * ::norm_rand() ) ;
+				return ::exp( meanlog + sdlog * ::norm_rand() ) ;
 			}
 	
 		private:
@@ -47,7 +47,7 @@
 				meanlog(meanlog_) {}
 	
 			inline double operator()() const {
-				return exp( meanlog + ::norm_rand() ) ;
+				return ::exp( meanlog + ::norm_rand() ) ;
 			}
 	
 		private:
@@ -57,10 +57,10 @@
 		class LNormGenerator_0 : public Generator<false,double> {
 		public:
 	
-			LNormGenerator_1( ) {}
+			LNormGenerator_0( ) {}
 	
 			inline double operator()() const {
-				return exp(::norm_rand() ) ;
+				return ::exp(::norm_rand() ) ;
 			}
 	
 		} ;
@@ -75,7 +75,7 @@
 			// TODO: R also throws a warning in that case, should we ?
 			return NumericVector( n, R_NaN ) ;
 		}  else if (sdlog == 0. || !R_FINITE(meanlog)){
-			return NumericVector( n, exp( meanlog ) ) ;
+			return NumericVector( n, ::exp( meanlog ) ) ;
 		} else {
 			return NumericVector( n, stats::LNormGenerator( meanlog, sdlog ) ); 
 		}

-- 
Gauss once played himself in a zero-sum game and won $50.
                      -- #11 at http://www.gaussfacts.com


More information about the Rcpp-devel mailing list