diff options
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -0,0 +1,42 @@ +#include "misc.h" +#include <math.h> +#include <stdlib.h> /* for size_t */ + +double logsumexp(double *a, size_t n) +{ + /* Returns the log of the sum of the exponentials of the array `a`. + * + * This function is designed to reduce underflow when the exponentials of + * `a` are very small, for example when computing probabilities. */ + size_t i; + double amax, sum; + + amax = a[0]; + for (i = 0; i < n; i++) { + if (a[i] > amax) amax = a[i]; + } + + sum = 0.0; + + for (i = 0; i < n; i++) { + sum += exp(a[i]-amax); + } + + sum = log(sum); + + return amax + sum; +} + +double norm(double x, double mu, double sigma) +{ + /* Returns the PDF for a gaussian random variable with mean `mu` and + * standard deviation `sigma`. */ + return exp(-pow(x-mu,2)/(2*pow(sigma,2)))/(sqrt(2*M_PI)*sigma); +} + +double norm_cdf(double x, double mu, double sigma) +{ + /* Returns the CDF for a gaussian random variable with mean `mu` and + * standard deviation `sigma`. */ + return erfc(-(x-mu)/(sqrt(2)*sigma))/2.0; +} |