Java Normal Probability Approximation Method

Recently, I’ve decided that I want to write my own statistics package in Java (I’m too bored for my own good). Originally, I wanted to write my own classes to handle the probability calculations under curves. However, this became a bit much when it came time to do f and student-T distributions. As such, I gave up and am now using a Java class provided by CERN laboratories under the GNU license.

Before I gave up, I wrote a simple method for calculating the area under normal distribution curves based on Z statistics (the result of a statistical Z-Test). It uses the Error Function to approximate left-tail probability (-infinity  -> Z-statistic).

        /*
	 * Normal probability method
         * @author Nicholas Pier
	 */
	static public double getCDF(double x){
		double p = .5 * (1 + getERF( x / Math.sqrt(2)));
		return p;
	}
        static private double getERF(double x){
		double a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4- Math.PI));
		double erf = (x / Math.abs(x)) * Math.sqrt(1 - Math.exp(-Math.pow(x, 2) *(((4/Math.PI) + (a * Math.pow(x, 2))) / (1 + (a * Math.pow(x, 2))))));
		return erf;
	}
This entry was posted in Personal, Programming, Tutorials. Bookmark the permalink.

One Response to Java Normal Probability Approximation Method

  1. Just for efficiency’s sake, here’s a few modifications to your code:


    static public double getCDF(double x){
    final double isqrt2 = 1.0 / Math.sqrt(2);
    double p = 0.5 * (1 + getERF( x * isqrt2 ) );
    return p;
    }
    static private double getERF(double x) {
    final double a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4- Math.PI));
    double sq = x * x;
    double asq = a * sq;
    double erf = Math.signum(x) * Math.sqrt(1 - Math.exp(-sq *(((4/Math.PI) + asq) / (1 + asq))));
    return erf;
    }

    It ensures Java does a little bit more inlining, and there’s less method call overhead.

Leave a Reply

Your email address will not be published. Required fields are marked *