summaryrefslogtreecommitdiff
path: root/src/erandom.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2013-05-31 13:28:51 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2013-05-31 13:28:51 +0000
commitdd2f4304247faadff2998867161aabac576aa9ad (patch)
tree7c947d1fc5f9b3a8e9c72702a8cd1d86a081285a /src/erandom.c
parent9be81131a2c65b45a9c4fd3497ae4bc5acfe7089 (diff)
downloadmpfr-dd2f4304247faadff2998867161aabac576aa9ad.tar.gz
GNU style
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@8555 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/erandom.c')
-rw-r--r--src/erandom.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/erandom.c b/src/erandom.c
index ff1d87a6a..90f528d34 100644
--- a/src/erandom.c
+++ b/src/erandom.c
@@ -27,42 +27,57 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
* given in John von Neumann, Various techniques used in connection with random
* digits, in A. S. Householder, G. E. Forsythe, and H. H. Germond, editors,
* "Monte Carlo Method", number 12 in Applied Mathematics Series, pp. 36-38
- * (NBS, Washington, DC, 1951), proceedings of a symposium held June 29-July 1,
+ * (NBS, Washington, DC, 1951), Proceedings of a symposium held June 29-July 1,
* 1949, in Los Angeles.
*
- * An modification to this algorithm is given in Charles F. F. Karney, Sampling
+ * A modification to this algorithm is given in Charles F. F. Karney, Sampling
* exactly from the normal distribution (March 2013),
* http://arxiv.org/abs/1303.6257v1 . Although this improves the bit
* efficiency, in practice, it results in a slightly slower algorithm for MPFR.
* So here the original von Neumann algorithm is used.
*/
-#include <random_deviate.h>
+#include "random_deviate.h"
/* true with prob exp(-x) */
-static int E(mpfr_random_deviate_t x, gmp_randstate_t r,
- mpfr_random_deviate_t p, mpfr_random_deviate_t q) {
+static int
+E (mpfr_random_deviate_t x, gmp_randstate_t r,
+ mpfr_random_deviate_t p, mpfr_random_deviate_t q)
+{
/* p and q are temporaries */
- mpfr_random_deviate_reset(p);
- if (!mpfr_random_deviate_less(p, x, r)) return 1;
- for (;;) {
- mpfr_random_deviate_reset(q);
- if (!mpfr_random_deviate_less(q, p, r)) return 0;
- mpfr_random_deviate_reset(p);
- if (!mpfr_random_deviate_less(p, q, r)) return 1;
- }
+ mpfr_random_deviate_reset (p);
+ if (!mpfr_random_deviate_less (p, x, r))
+ return 1;
+ for (;;)
+ {
+ mpfr_random_deviate_reset (q);
+ if (!mpfr_random_deviate_less (q, p, r))
+ return 0;
+ mpfr_random_deviate_reset (p);
+ if (!mpfr_random_deviate_less (p, q, r))
+ return 1;
+ }
}
/* return an exponential random deviate with mean 1 as a MPFR */
-int mpfr_erandom(mpfr_t z, gmp_randstate_t r, mpfr_rnd_t rnd) {
+int
+mpfr_erandom (mpfr_t z, gmp_randstate_t r, mpfr_rnd_t rnd)
+{
mpfr_random_deviate_t x, p, q;
int inex;
unsigned long k = 0;
- mpfr_random_deviate_init(x);
- mpfr_random_deviate_init(p); mpfr_random_deviate_init(q);
- while (!E(x, r, p, q)) { ++k; mpfr_random_deviate_reset(x); }
- mpfr_random_deviate_clear(q); mpfr_random_deviate_clear(p);
- inex = mpfr_random_deviate_value(0, k, x, z, r, rnd);
- mpfr_random_deviate_clear(x);
+
+ mpfr_random_deviate_init (x);
+ mpfr_random_deviate_init (p);
+ mpfr_random_deviate_init (q);
+ while (!E(x, r, p, q))
+ {
+ ++k;
+ mpfr_random_deviate_reset (x);
+ }
+ mpfr_random_deviate_clear (q);
+ mpfr_random_deviate_clear (p);
+ inex = mpfr_random_deviate_value (0, k, x, z, r, rnd);
+ mpfr_random_deviate_clear (x);
return inex;
}