20 #include <gsl/gsl_sf_erf.h>
21 #include <gsl/gsl_sf_expint.h>
32 return std::exp(-x * x / 2.0) / std::sqrt(
M_TWOPI);
42 double normalized_x = (x - average) / std_dev;
43 static double root2 = std::sqrt(2.0);
44 return (gsl_sf_erf(normalized_x / root2) + 1.0) / 2.0;
56 return std::sin(x) / x;
65 if (z == complex_t(0., 0.))
67 return std::sin(z) / z;
72 if (std::abs(z) < std::numeric_limits<double>::epsilon())
74 return std::tanh(z) / z;
79 static const double SQRT6DOUBLE_EPS = std::sqrt(6.0 * std::numeric_limits<double>::epsilon());
80 auto nd =
static_cast<double>(
N);
81 if (std::abs(nd * x) < SQRT6DOUBLE_EPS)
83 double num = std::sin(nd * x);
84 double den = std::sin(x);
91 throw std::runtime_error(
"Error in Math::erf: negative argument is not allowed");
94 return gsl_sf_erf(arg);
127 static_cast<unsigned>(std::chrono::system_clock::now().time_since_epoch().count());
128 std::default_random_engine generator(seed);
131 if (average < 1000.0) {
132 std::poisson_distribution<int> distribution(average);
133 int sample = distribution(generator);
134 return (
double)sample;
137 std::normal_distribution<double> distribution(average, std::sqrt(average));
138 double sample = distribution(generator);
139 return std::max(0.0, sample);
Defines M_PI and some more mathematical constants.
double sinc(double x)
sinc function:
complex_t tanhc(complex_t z)
Complex tanhc function: .
double Gaussian(double x, double average, double std_dev)
double erf(double arg)
Error function of real-valued argument.
double GeneratePoissonRandom(double average)
double Laue(double x, size_t N)
Real Laue function: .
double IntegratedGaussian(double x, double average, double std_dev)
double cot(double x)
cotangent function:
double StandardNormal(double x)