123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*-Algorithm AS 66
- * The Normal Integral, by I. D. Hill, 1973.
- * Applied Statistics 22(3):424-427.
- *
- * Translation to C by James Darrell McCauley, mccauley@ecn.purdue.edu.
- *
- * Calculates the upper or lower tail area of the standardized normal
- * curve corresponding to any given argument.
- *
- * x - the argument value
- * upper: 1 -> the area from x to \infty
- * 0 -> the area from -\infty to x
- *
- * Notes:
- * The constant LTONE should be set to the value at which the
- * lower tail area becomes 1.0 to the accuracy of the machine.
- * LTONE=(n+9)/3 gives the required value accurately enough, for a
- * machine that produces n decimal digits in its real numbers.
- *
- * The constant UTZERO should be set to the value at which the upper
- * tail area becomes 0.0 to the accuracy of the machine. This may be
- * taken as the value such that exp(-0.5 * UTZERO * UTZERO) /
- * (UTZERO * sqrt(2*M_PI)) is just greater than the smallest allowable
- * real numbers.
- */
- #include <math.h>
- #define LTONE 7.0
- #define UTZERO 18.66
- double Cdhc_alnorm(double x, int upper)
- {
- double ret, z, y;
- int up;
- up = upper;
- z = x;
- if (x < 0.0) {
- up = up == 0 ? 1 : 0;
- z = -x;
- }
- if (!(z <= LTONE || (up == 1 && z <= UTZERO)))
- ret = 0.0;
- else {
- y = 0.5 * z * z;
- if (z <= 1.28)
- ret = 0.5 - z * (0.398942280444 - 0.399903438504 * y /
- (y + 5.75885480458 - 29.8213557808 /
- (y + 2.62433121679 + 48.6959930692 /
- (y + 5.92885724438))));
- else
- ret = 0.398942280385 * exp(-y) /
- (z - 3.8052e-8 + 1.00000615302 /
- (z + 3.98064794e-4 + 1.98615381364 /
- (z - 0.151679116635 + 5.29330324926 /
- (z + 4.8385912808 - 15.1508972451 /
- (z + 0.742380924027 + 30.789933034 /
- (z + 3.99019417011))))));
- }
- if (up == 0)
- ret = 1.0 - ret;
- return ret;
- }
|