The R Project SVN R

Rev

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

Rev 70242 Rev 71411
Line 44... Line 44...
44
 
44
 
45
#include "nmath.h"
45
#include "nmath.h"
46
 
46
 
47
double rnbinom(double size, double prob)
47
double rnbinom(double size, double prob)
48
{
48
{
49
    if(!R_FINITE(prob) || size <= 0 || prob <= 0 || prob > 1)
49
    if(!R_FINITE(prob) || ISNAN(size) || size <= 0 || prob <= 0 || prob > 1)
50
	/* prob = 1 is ok, PR#1218 */
50
	/* prob = 1 is ok, PR#1218 */
51
	ML_ERR_return_NAN;
51
	ML_ERR_return_NAN;
52
    if(!R_FINITE(size)) size = DBL_MAX / 2.; // '/2' to prevent rgamma() returning Inf
52
    if(!R_FINITE(size)) size = DBL_MAX / 2.; // '/2' to prevent rgamma() returning Inf
53
    return (prob == 1) ? 0 : rpois(rgamma(size, (1 - prob) / prob));
53
    return (prob == 1) ? 0 : rpois(rgamma(size, (1 - prob) / prob));
54
}
54
}
55
 
55
 
56
double rnbinom_mu(double size, double mu)
56
double rnbinom_mu(double size, double mu)
57
{
57
{
58
    if(!R_FINITE(mu) || size <= 0 || mu < 0)
58
    if(!R_FINITE(mu) || ISNAN(size) || size <= 0 || mu < 0)
59
	ML_ERR_return_NAN;
59
	ML_ERR_return_NAN;
60
    if(!R_FINITE(size)) size = DBL_MAX / 2.;
60
    if(!R_FINITE(size)) size = DBL_MAX / 2.;
61
    return (mu == 0) ? 0 : rpois(rgamma(size, mu / size));
61
    return (mu == 0) ? 0 : rpois(rgamma(size, mu / size));
62
}
62
}