package utilities;


import java.awt.*;

public class InvNormal {
	private static final int N = 1000;
	private static final double MAX = 5.0;
	private static double del = MAX/(double)N;
	private static double dVals[] = new double[N];
	private static double dxVals[] = new double[N];
	
	
	public static double erfcc(double x) {
		double t,z,ans;
		
		z=Math.abs(x);
		t=1.0/(1.0+0.5*z);
		
//		System.out.println("z="+z+",t="+t);
		
		double temp1 = (.27886807+t*(-1.13520398+
             t*(1.48851587+t*(-.82215223+t*.17087277))));
       	double temp2 = t*(1.00002368+t*(.37409196+
             t*(.09678418+t*(-.18628806+t*temp1))));
             
		ans = t*Math.exp(-z*z-1.26551223+temp2);
//		
//		System.out.println("temp1 = " + temp1 + ",temp2 = " + temp2);
//		System.out.println("ans = "+ans);
     	
		if (ans>=0) return ans;
		return 2.0-ans;
	}
		      
	public InvNormal() {
		double sum = 0;
		double x = 0;
		double sqrt2 = Math.sqrt(2.0);
		
		for (int i=0; i<N; i++) {
			dxVals[i] = x;
			dVals[i] = (1.0-erfcc(x/sqrt2))/2.0;
//			if (i<5) {
//				System.out.println("x = " + x);
//			}
			x+=del;
		}
	}
	
	public double findZ(double confLevel) {
	
		if (confLevel<0 || confLevel>=1) return -1;
		double val = confLevel/2.0;
		
		int i;
		i=1;
		while (dVals[i]<val) {
			i++;
			if (i==N) return -1;
		}
		i--;
		double y1 = dVals[i];
		double y2 = dVals[i+1];
		double perc = (val - y1)/(y2-y1);
		return dxVals[i] + perc * del;
	}
}
