The R Project SVN R

Rev

Rev 19500 | Rev 36820 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 19500 Rev 22904
Line 39... Line 39...
39
 
39
 
40
#define repeat for(;;)
40
#define repeat for(;;)
41
 
41
 
42
double rbinom(double nin, double pp)
42
double rbinom(double nin, double pp)
43
{
43
{
44
    /* FIXME: These should becomre THREAD_specific globals : */
44
    /* FIXME: These should become THREAD_specific globals : */
45
 
45
 
46
    static double c, fm, npq, p1, p2, p3, p4, qn;
46
    static double c, fm, npq, p1, p2, p3, p4, qn;
47
    static double xl, xll, xlr, xm, xr;
47
    static double xl, xll, xlr, xm, xr;
48
 
48
 
49
    static double psave = -1.0;
49
    static double psave = -1.0;
Line 57... Line 57...
57
    n = floor(nin + 0.5);
57
    n = floor(nin + 0.5);
58
    if (n != nin) ML_ERR_return_NAN;
58
    if (n != nin) ML_ERR_return_NAN;
59
 
59
 
60
    if (!R_FINITE(n) || !R_FINITE(pp) ||
60
    if (!R_FINITE(n) || !R_FINITE(pp) ||
61
	/* n=0, p=0, p=1 are not errors <TSL>*/
61
	/* n=0, p=0, p=1 are not errors <TSL>*/
62
	n < 0. || pp < 0. || pp > 1.)	ML_ERR_return_NAN;
62
	n < 0 || pp < 0. || pp > 1.)	ML_ERR_return_NAN;
63
 
63
 
64
    if (n == 0. || pp == 0.) return 0;
64
    if (n == 0 || pp == 0.) return 0;
65
    if (pp == 1.) return n;
65
    if (pp == 1.) return n;
66
 
66
 
67
    p = fmin2(pp, 1. - pp);
67
    p = fmin2(pp, 1. - pp);
68
    q = 1. - p;
68
    q = 1. - p;
69
    np = n * p;
69
    np = n * p;