The erf_inv is based on code accompanying the article "Approximating
the erfinv function" in GPU Computing Gems, Volume 2. Orginally I was using the approximation described at https://en.wikipedia.org/wiki/Error_function#Approximation_with_elementary_functions but found them to be a lot less accurate than the boost::math version for some inputs.
I don't have a great background in this kind of maths, I've found algorithm descriptions through Googling and checked correctness by comparing against the values returned by boost math. It seems to be OK.
Tests added using common input values and comparing against the output from original
boost::math
implementations.The normal distribution CDF function is taken from the example code at http://en.cppreference.com/w/cpp/numeric/math/erfc.
The
erf_inv
is based on code accompanying the article "Approximating the erfinv function" in GPU Computing Gems, Volume 2. Orginally I was using the approximation described at https://en.wikipedia.org/wiki/Error_function#Approximation_with_elementary_functions but found them to be a lot less accurate than theboost::math
version for some inputs.I don't have a great background in this kind of maths, I've found algorithm descriptions through Googling and checked correctness by comparing against the values returned by boost math. It seems to be OK.