On 28 January 2010 at 14:00, Guillaume Yziquel wrote: | Dirk Eddelbuettel a écrit : | > | > Salut Guilluame, | > | > | > val norm_rand : unit -> float | > | > Random variates from the standard normal distribution. Bug: currently systematically returns -8.77332116900134373. | > | | > | Any idea as to why the function systematically returns the same value? | > | Is there a way the math library should be initialised? | > | > I think it is pretty clearly documented in R-exts: | > | > However, before these are used, the user must call | > | > GetRNGstate(); | > | > and after all the required variates have been generated, call | > | > PutRNGstate(); | > | > These essentially read in (or create) `.Random.seed' and write it out | > after use. | | Fair enough. I admit I've been busy with low detail stuff, and omitted | to come back to R-exts. | | However, I have another question on which I do not find information (I | found it once, but do not know how to find it again...): What's the big | difference between using the R mathematical library in standalone mode | and not in standalone mode? How does it translate in terms of C | directives and linking modalities? I've noticed the MATHLIB_STANDALONE | macro, but I do not know how I should use it...
Well, Debian comes to the rescue. Do 'sudo apt-get install r-mathlib' to the standalone library. Then copy the example file out, add the missing 'extern N01type N01_kind;' (and that it is missing may well be a bug -- I used 2.10.1 here -- anyone from R Core listening in who can add the one line ?) e...@ron:~> cp /usr/share/doc/r-mathlib/examples/test.c /tmp/ e...@ron:~> grep extern /tmp/test.c extern N01type N01_kind; /* from nmath/snorm.c */ e...@ron:~> gcc -o /tmp/mathlibtest /tmp/test.c -lRmath -lm e...@ron:~> /tmp/mathlibtest *** loaded '/tmp/mathlibtest' one normal 1.119638 normal via BM -1.734578 e...@ron:~> I hope this answers your questions -- the standalone math library links with only its libRmath and nothing else from R. It also only consume Rmath.h (which I put into /usr/include so you need no -I arguments to gcc). Hope this helps, Dirk PS For reference, here is test.c with line edited in: /* * Mathlib : A C Library of Special Functions * Copyright (C) 2000-7 The R Development Core Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * http://www.r-project.org/Licenses/ * */ #define MATHLIB_STANDALONE 1 #include <Rmath.h> #include <stdio.h> typedef enum { BUGGY_KINDERMAN_RAMAGE, AHRENS_DIETER, BOX_MULLER, USER_NORM, INVERSION, KINDERMAN_RAMAGE } N01type; extern N01type N01_kind; /* from nmath/snorm.c */ int main(int argc, char** argv) { /* something to force the library to be included */ qnorm(0.7, 0.0, 1.0, 0, 0); printf("*** loaded '%s'\n", argv[0]); set_seed(123, 456); N01_kind = AHRENS_DIETER; printf("one normal %f\n", norm_rand()); set_seed(123, 456); N01_kind = BOX_MULLER; printf("normal via BM %f\n", norm_rand()); return 0; } -- Three out of two people have difficulties with fractions. ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel