From mwelinder at gmail.com  Fri May 27 20:24:36 2005
From: mwelinder at gmail.com (mwelinder@gmail.com)
Date: Fri May 27 20:24:46 2005
Subject: [Rd] qcauchy accuracy (PR#7902)
Message-ID: <20050527182436.07CE88601@slim.kubism.ku.dk>

Full_Name: Morten Welinder
Version: 2.1.0
OS: src only
Submission from: (NULL) (216.223.241.212)


Now that pcauchy has been fixed, it is becoming clear that qcauchy suffers from
the same problems.

    qcauchy(pcauchy(1e100,0,1,FALSE,TRUE),0,1,FALSE,TRUE)

should yield 1e100 back, but I get 1.633178e+16.  The code below does much
better.  Notes:

1. p need not be finite.  -Inf is ok in the log_p case and R_Q_P01_check
   already checks things.

2. No need to disallow scale=0 and infinite location.

3. The code below uses isnan and finite directly.  It needs to be adapted to
the
   R way of doing that.


double
qcauchy (double p, double location, double scale, int lower_tail, int log_p)
{
	if (isnan(p) || isnan(location) || isnan(scale))
		return p + location + scale;

	R_Q_P01_check(p);
	if (scale < 0 || !finite(scale)) ML_ERR_return_NAN;

	if (log_p) {
		if (p > -1)
			lower_tail = !lower_tail, p = -expm1 (p);
		else
			p = exp (p);
	}
	if (lower_tail) scale = -scale;
	return location + scale / tan(M_PI * p);
}


[Rd] qcauchy accuracy (PR#7902)
mwelinder@gmail.com