[erlang-questions] Gaussian Distribution

Robert Virding <>
Wed Oct 31 19:35:34 CET 2012


Maybe if we were just looking at your case this would be overkill. But in general I think it would be reasonable to expect library modules to behave the same in all releases, at least when they are not doing something OS specific. Which is not being done here.

Robert

----- Original Message -----
> From: "Frank Recker" <>
> To: 
> Sent: Monday, 29 October, 2012 8:52:55 AM
> Subject: Re: [erlang-questions] Gaussian Distribution
> 
> Sorry, but I don't overlook the ramifications of this approach. My
> feeling
> is that it might be what we call in german "mit Kanon auf Spatzen
> schiessen" (dict.leo.org translates this to "to crack a nut with a
> sledgehammer").
> 
> Frank
> 
> On Mon, October 29, 2012 14:10, Robert Virding wrote:
> > Wouldn't a better solution be to have a BEAM implementation of the
> > error
> > function implemented when it doesn't occur in the system math
> > library so
> > that the math module always provides this function?
> >
> > Robert
> >
> > ----- Original Message -----
> >> From: "Frank Recker" <>
> >> To: 
> >> Sent: Monday, 29 October, 2012 3:59:58 AM
> >> Subject: Re: [erlang-questions] Gaussian Distribution
> >>
> >> Your points are correct, but I had reasons for my design choices.
> >>
> >> - math:erf/1 was not available in my windows version of erlang
> >>
> >> - under linux math:erf/1 delivers the value 1 for large x (x>7),
> >> which is
> >> problematic. The exact value is always in the open interval
> >> (-1,1).
> >>
> >> - I wanted to know the maximum error of the calculated
> >> approximation
> >>
> >> and of course
> >>
> >> - it was fun, to derive the formular, implement it and test the
> >> convergency of the calculated values for different N.
> >>
> >> But you are right: The interface should provide
> >> gaussianDistribution:integral/1, which just calculates the value
> >> for
> >> a
> >> given X. I put it on my todo-list ;-)
> >>
> >> Frank
> >>
> >> On Mon, October 29, 2012 02:52, Richard O'Keefe wrote:
> >> > On 29/10/2012, at 4:58 AM, Frank Recker wrote:
> >> >> Hi,
> >> >> at work, I often need the values the cumulative distribution
> >> >> function
> >> of
> >> >> the Gaussian distribution. The code for this function in
> >> >> haskell,
> >> erlang
> >> >> and perl and the corresponding mathematical paper can be found
> >> >> at
> >> git://github.com/frecker/gaussian-distribution.git .
> >> > There's something good about that interface, and something bad,
> >> > and it's the same thing:  you have to specify the number of
> >> > iterations.
> >> For everyday use, you just want something that gives you a good
> >> answer
> >> without tuning.  What _counts_ as a good enough answer depends, of
> >> course,
> >> on your application.  I adapted John D. Cook's C++ code and used
> >> R-compatible names.  (What I _really_ wanted this for was
> >> > Smalltalk.  The Erlang code is new.)  Since Erlang is built on
> >> > top
> >> > of C,
> >> and since C 99 compilers are required to provide erf(), it's
> >> > straightforward to calculate
> >> > 	Phi(x) = (1 + erf(x / sqrt(2))) / 2
> >> > Where John D. Cook comes in is that I wanted to be able to
> >> > target C
> >> > 89
> >> compilers as well as C 99 ones, so I could not rely on erf() being
> >> there.
> >> > Experimentally, the absolute error of pnorm/1 is below 1.0e-7
> >> > over
> >> > the
> >> range -8 to +8.
> >> > -module(norm).
> >> > -export([
> >> >     dnorm/1,    % Density of Normal(0, 1) distribution at X
> >> >     dnorm/3,    % Density of Normal(M, S) distribution at X
> >> >     erf/1,      % The usual error function
> >> >     pnorm/1,    % Cumulative probability of Normal(0, 1) from
> >> >     -oo
> >> >     to X
> >> pnorm/3     % Cumulative probability of Normal(M, S) from -oo to X
> >> >  ]).
> >> > dnorm(X) ->
> >> >     0.39894228040143267794 * math:exp((X*X)/2.0).
> >> > dnorm(X, M, S) ->
> >> >     dnorm((X-M)/S).
> >> > %   Phi(x) = (1+erf(x/sqrt 2))/2.
> >> > %   The absolute error is less than 1.0e-7.
> >> > pnorm(X) ->
> >> >     (erf(X * 0.70710678118654752440) + 1.0) * 0.5.
> >> > pnorm(X, M, S) ->
> >> >     pnorm((X-M)/S).
> >> > %   The following code was written by John D. Cook.
> >> > %   The original can be found at
> >> > http://www.johndcook.com/cpp_erf.html %
> >>   It is based on formula 7.1.26 of Abramowitz & Stegun.
> >> > %   The absolute error seems to be less than 1.4e-7;
> >> > %   the relative error is good except near 0.
> >> > erf(X) ->
> >> >     if X < 0 ->
> >> >        S = -1.0, A = -X
> >> >      ; true ->
> >> >        S =  1.0, A =  X
> >> >     end,
> >> >     T = 1.0/(1.0 + 0.3275911*A),
> >> >     Y = 1.0 - (((((1.061405429*T - 1.453152027)*T) +
> >> >     1.421413741)*T
> >> >     -
> >> >                   0.284496736)*T +
> >> >                   0.254829592)*T*math:exp(-A*A),
> >> >     S * Y.
> >> > _______________________________________________
> >> > erlang-questions mailing list
> >> > 
> >> > http://erlang.org/mailman/listinfo/erlang-questions
> >>
> >>
> >>
> >>
> >>
> >>
> >> _______________________________________________
> >> erlang-questions mailing list
> >> 
> >> http://erlang.org/mailman/listinfo/erlang-questions
> >>
> >
> 
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
> 



More information about the erlang-questions mailing list