From maechler at stat.math.ethz.ch  Wed Jun  1 08:57:18 2005
From: maechler at stat.math.ethz.ch (maechler@stat.math.ethz.ch)
Date: Wed Jun  1 08:57:25 2005
Subject: [Rd] qcauchy accuracy (PR#7902)
Message-ID: <20050601065718.37105A1C3@slim.kubism.ku.dk>

>>>>> "Morten" == Morten Welinder <mwelinder@gmail.com>
>>>>>     on Fri, 27 May 2005 20:24:36 +0200 (CEST) writes:

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


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

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

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

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

yes

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

yes

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

I've done this, and started testing the new code; a version will
be put into the next version of R.

Thank you for the suggestions.

   >> 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)
maechler@stat.math.ethz.ch