12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include <math.h>
- /*-
- * SUBROUTINE Cdhc_normp(Z, P, Q, PDF)
- *
- * Normal distribution probabilities accurate to 1.e-15.
- * Z = no. of standard deviations from the mean.
- * P, Q = probabilities to the left & right of Z. P + Q = 1.
- * PDF = the probability density.
- *
- * Based upon algorithm 5666 for the error function, from:
- * Hart, J.F. et al, 'Computer Approximations', Wiley 1968
- *
- * Programmer: Alan Miller
- *
- * Latest revision - 30 March 1986
- *
- */
- /* Conversion to C by James Darrell McCauley, 24 September 1994 */
- double Cdhc_normp(double z)
- {
- static double p[7] = { 220.2068679123761, 221.2135961699311,
- 112.079291497870, 33.91286607838300, 6.37396220353165,
- 0.7003830644436881, 0.352624965998910e-1
- };
- static double q[8] = { 440.4137358247522, 793.8265125199484,
- 637.3336333788311, 296.5642487796737, 86.78073220294608,
- 16.06417757920695, 1.755667163182642, 0.8838834764831844e-1
- };
- static double cutoff = 7.071, root2pi = 2.506628274631001;
- double zabs, expntl;
- double pee, queue, pdf;
- zabs = fabs(z);
- if (zabs > 37.0) {
- pdf = 0.0;
- if (z > 0.0) {
- pee = 1.0;
- queue = 0.0;
- }
- else {
- pee = 0.0;
- queue = 1.0;
- }
- return pee;
- }
- expntl = exp(-0.5 * zabs * zabs);
- pdf = expntl / root2pi;
- if (zabs < cutoff)
- pee = expntl * ((((((p[6] * zabs + p[5]) * zabs + p[4])
- * zabs + p[3]) * zabs + p[2]) * zabs +
- p[1]) * zabs + p[0])
- / (((((((q[7] * zabs + q[6]) * zabs + q[5]) * zabs + q[4])
- * zabs + q[3]) * zabs + q[2]) * zabs + q[1]) * zabs + q[0]);
- else
- pee = pdf / (zabs + 1.0 / (zabs + 2.0 / (zabs + 3.0 / (zabs + 4.0 /
- (zabs +
- 0.65)))));
- if (z < 0.0)
- queue = 1.0 - pee;
- else {
- queue = pee;
- pee = 1.0 - queue;
- }
- return pee;
- }
|