LibRan  0.1
Pseudo-random number distribution generator
LRpoisson.c
Go to the documentation of this file.
1 
47 /*
48  * Copyright 2019 R.K. Owen, Ph.D.
49  * License see lgpl.md (Gnu Lesser General Public License)
50  */
51 #ifdef __cplusplus
52 extern "C" {
53 #endif
54 
55 #include <math.h>
56 #include "libran.h"
57 
58 /* int */
67  float zero = 0.0, one = 1.0, u, p = one;
68  int kk = 0;
69  if (isnan(o->q))
70  o->q = expf(-o->p);
71 
72  do {
73  do {
74  u = o->uf(o);
75  } while (u == zero);
76  kk++;
77  p *= u;
78  } while (p > o->q);
79 
80  return kk - 1;
81 }
82 
91 float LRi_poisson_PDF(LR_obj *o, int x) {
92  float zero = 0.0, one = 1.0, p = one;
93  if (isnan(o->q))
94  o->q = expf(- o->p);
95 
96  if (x < 0) return zero;
97 
98  if (x == 0) {
99  return o->q;
100  } else {
101  for (int nn = 1; nn <= x; nn++) {
102  p *= (o->p/nn);
103  }
104  return p * o->q;
105  }
106 }
107 
116 float LRi_poisson_CDF(LR_obj *o, int x) {
117  float zero = 0.0, one = 1.0, p = one, s = one;
118  if (isnan(o->q))
119  o->q = expf(- o->p);
120 
121  if (x < 0) return zero;
122 
123  if (x == 0) {
124  return o->q;
125  } else {
126  for (int nn = 1; nn <= x; nn++) {
127  p *= (o->p/nn);
128  s += p;
129  }
130  return s * o->q;
131  }
132 }
133 
134 #ifdef __cplusplus
135 }
136 #endif
float p
Definition: libran.h:145
int LRi_poisson_RAN(LR_obj *o)
LRi_poisson_RAN(LR_obj *o) - int Poisson distributed variate. Default values: scale m = 1...
Definition: LRpoisson.c:66
float q
Definition: libran.h:146
float(* uf)(LR_obj *)
Definition: libran.h:153
float LRi_poisson_PDF(LR_obj *o, int x)
LRi_poisson_PDF(LR_obj *o, int x) - Poisson probablity (or mass) distribution function.
Definition: LRpoisson.c:91
float LRi_poisson_CDF(LR_obj *o, int x)
LRi_poisson_CDF(LR_obj *o, int x) - Poisson distribution cumulative distribution function.
Definition: LRpoisson.c:116
The LibRan common header file.
the fundamental LibRan random variate distribution object
Definition: libran.h:134