summaryrefslogtreecommitdiff
path: root/gcell/lib/runtime/spu/gc_random.c
diff options
context:
space:
mode:
authoreb2009-01-15 10:23:50 +0000
committereb2009-01-15 10:23:50 +0000
commit4b5cfa809a01a494c4f5e6b052414ed9b3d066cb (patch)
tree1524eb995c21cccb3d76f62ec0cc8bf9a319a54f /gcell/lib/runtime/spu/gc_random.c
parentddd347cc96e38c3758dea53cb0d93391ea566a35 (diff)
downloadgnuradio-4b5cfa809a01a494c4f5e6b052414ed9b3d066cb.tar.gz
gnuradio-4b5cfa809a01a494c4f5e6b052414ed9b3d066cb.tar.bz2
gnuradio-4b5cfa809a01a494c4f5e6b052414ed9b3d066cb.zip
Merged eb/gcell-wip -r10213:10230 into the trunk. This reduces the
overhead of off-loading jobs, such that it is now feasible to off-load 50us jobs on the QS21 and 10us jobs on the PS3. See wiki:Gcell for performance graphs. There is still plenty of room for improvement. I'll be revisiting this in a week or so. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10231 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gcell/lib/runtime/spu/gc_random.c')
-rw-r--r--gcell/lib/runtime/spu/gc_random.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcell/lib/runtime/spu/gc_random.c b/gcell/lib/runtime/spu/gc_random.c
index 214309b53..ae2fde875 100644
--- a/gcell/lib/runtime/spu/gc_random.c
+++ b/gcell/lib/runtime/spu/gc_random.c
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -22,9 +22,9 @@
static int last_val = 0;
-#define M 714025 // values from Numerical Recipes in C, 1988
-#define A 4096
-#define C 150889
+# define M 259200 // values from Numerical Recipes in C, 1988
+# define A 7141
+# define C 54773
void
gc_set_seed(int seed)
@@ -32,9 +32,13 @@ gc_set_seed(int seed)
last_val = ((unsigned int) seed) % M;
}
+/*
+ * Return a uniformly distributed value in the range [0, 1.0)
+ * (Linear congruential generator. YMMV. Caveat emptor.)
+ */
float
gc_uniform_deviate(void)
{
last_val = (last_val * A + C) % M;
- return (float) last_val / (float) M;
+ return (float) last_val * (1.0f / (float) M);
}