#include #include #include #ifdef _MSC_VER #define EXPORT __declspec(dllexport) #else #define EXPORT #endif static const char *error = NULL; double randn (double mu, double sigma) { double U1, U2, W, mult; static double X1, X2; static int call = 0; if (call == 1) { call = !call; return (mu + sigma * (double) X2); } do { U1 = -1 + ((double) rand () / RAND_MAX) * 2; U2 = -1 + ((double) rand () / RAND_MAX) * 2; W = pow (U1, 2) + pow (U2, 2); } while (W >= 1 || W == 0); mult = sqrt ((-2 * log (W)) / W); X1 = U1 * mult; X2 = U2 * mult; call = !call; return (mu + sigma * (double) X1); } EXPORT int init(const char *str) { return 1; } EXPORT const char * getLastError() { return error; } EXPORT int eval(const char *func, int nArgs, const double **inReal, const double **inImag, int blockSize, double *outReal, double *outImag) { int i, j; if (strcmp("randgauss", func) == 0) { if (nArgs != 3) { error = "Expected 3 arguments (x (unused), mu,sigma)"; return 0; } for (i = 0; i < blockSize; i++) { //double x = inReal[0][i]; double mu=inReal[1][i]; double sigma=inReal[2][i]; //outReal[i] = (x == 0) ? 1 : sin(x) / x; outReal[i]=randn(mu,sigma); } return 1; } else { error = "Unknown function"; return 0; } }