The R Project SVN R

Rev

Rev 87903 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 87903 Rev 88248
Line 31... Line 31...
31
#include "dpq.h"
31
#include "dpq.h"
32
/* after config.h to avoid warning on Solaris */
32
/* after config.h to avoid warning on Solaris */
33
#include <limits.h>
33
#include <limits.h>
34
 
34
 
35
/**----------- DEBUGGING -------------
35
/**----------- DEBUGGING -------------
36
 *
-
 
37
 *	make CFLAGS='-DDEBUG_bratio  ...'
-
 
38
 *MM (w/ Debug, w/o Optimization):
36
    (cd `R-devel-pbeta-dbg RHOME`/src/nmath ;
39
 (cd `R-devel-pbeta-dbg RHOME`/src/nmath ; gcc -I. -I../../src/include -I../../../R/src/include  -DHAVE_CONFIG_H -fopenmp  -g -pedantic -Wall -DDEBUG_bratio -DDEBUG_q -Wcast-align -Wconversion -fno-common -Wno-sign-conversion -Wstrict-prototypes -Wclobbered -Werror=implicit-function-declaration  -c ../../../R/src/nmath/toms708.c -o toms708.o; cd ../..; make R)
37
 	make -B CFLAGS='-DDEBUG_bratio' toms708.o ; cd ../..; make R )
40
*/
38
*/
41
#ifdef DEBUG_bratio
39
#ifdef DEBUG_bratio
42
# define R_ifDEBUG_printf(...) REprintf(__VA_ARGS__)
40
# define R_ifDEBUG_printf(...) REprintf(__VA_ARGS__)
43
#else
41
#else
44
# define R_ifDEBUG_printf(...)
42
# define R_ifDEBUG_printf(...)
Line 79... Line 77...
79
 *      This work published in  Transactions On Mathematical Software,
77
 *      This work published in  Transactions On Mathematical Software,
80
 *      vol. 18, no. 3, September 1992, pp. 360-373.
78
 *      vol. 18, no. 3, September 1992, pp. 360-373.
81
 */
79
 */
82
 
80
 
83
/* Changes by R Core Team :
81
/* Changes by R Core Team :
84
 * add log_p  and work towards gaining precision in that case
82
 * add log_p  and work towards gaining precision in that case;
-
 
83
 * work for very large (but finite) {a,b}
85
 */
84
 */
86
 
85
 
87
attribute_hidden void
86
attribute_hidden void
88
bratio(double a, double b, double x, double y, double *w, double *w1,
87
bratio(double a, double b, double x, double y, double *w, double *w1,
89
       int *ierr, int log_p)
88
       int *ierr, int log_p)
Line 742... Line 741...
742
static double bfrac(double a, double b, double x, double y, double lambda,
741
static double bfrac(double a, double b, double x, double y, double lambda,
743
		    double eps, int log_p)
742
		    double eps, int log_p)
744
{
743
{
745
/* -----------------------------------------------------------------------
744
/* -----------------------------------------------------------------------
746
       Continued fraction expansion for I_x(a,b) when a, b > 1.
745
       Continued fraction expansion for I_x(a,b) when a, b > 1.
747
       It is assumed that  lambda = (a + b)*y - b.
746
       It is assumed that  lambda = (a + b)*y - b.  (x+y = 1)
748
   -----------------------------------------------------------------------*/
747
   -----------------------------------------------------------------------*/
749
 
748
 
750
    double c, e, n, p, r, s, t, w, c0, c1, r0, an, bn, yp1, anp1, bnp1,
-
 
751
	beta, alpha, brc;
-
 
752
 
-
 
753
    if(!R_FINITE(lambda)) return ML_NAN;// TODO: can return 0 or 1 (?)
749
    if(!R_FINITE(lambda)) return ML_NAN;// TODO: can return 0 or 1 (?)
754
    R_ifDEBUG_printf(" bfrac(a=%g, b=%g, x=%g, y=%g, lambda=%g, eps=%g, log_p=%d):",
750
    R_ifDEBUG_printf(" bfrac(a=%g, b=%g, x=%g, y=%g, lambda=%g, eps=%g, log_p=%d):\n",
755
		     a,b,x,y, lambda, eps, log_p);
751
		     a,b,x,y, lambda, eps, log_p);
756
    brc = brcomp(a, b, x, y, log_p);
752
    double brc = brcomp(a, b, x, y, log_p);
757
    if(ISNAN(brc)) { // e.g. from   L <- 1e308; pnbinom(L, L, mu = 5)
753
    if(ISNAN(brc)) { // till 2025-05, from   L <- 1e308; pnbinom(L, L, mu = 5) -- does this still happen?
758
	R_ifDEBUG_printf(" --> brcomp(a,b,x,y) = NaN\n");
754
	R_ifDEBUG_printf(" --> brcomp(a,b,x,y) = NaN; ");
759
	ML_WARN_return_NAN; // TODO: could we know better?
755
	ML_WARN_return_NAN; // TODO: could we know better?
760
    }
756
    }
761
    if (!log_p && brc == 0.) {
757
    if (!log_p && brc == 0.) {
762
	R_ifDEBUG_printf(" --> brcomp(a,b,x,y) underflowed to 0.\n");
758
	R_ifDEBUG_printf(" --> brcomp(a,b,x,y) underflowed to 0; ");
763
	return 0.;
759
	return 0.;
764
    }
760
    }
765
#ifdef DEBUG_bratio
761
#ifdef DEBUG_bratio
766
    else
762
    else
767
	REprintf("\n");
763
	REprintf("brcomp(a,b, x,y) = %g; ", brc);
768
#endif
764
#endif
769
 
765
 
-
 
766
    double
770
    c = lambda + 1.;
767
	c = lambda + 1.,
771
    c0 = b / a;
768
	c0 = b / a,
772
    c1 = 1. / a + 1.;
769
	c1 = 1. / a + 1.,
773
    yp1 = y + 1.;
770
	yp1 = y + 1.,
774
 
-
 
775
    n = 0.;
771
	n = 0.,
776
    p = 1.;
772
	p = 1.,
777
    s = a + 1.;
773
	s = a + 1.,
778
    an = 0.;
774
	an = 0.,
779
    bn = 1.;
775
	bn = 1.,
780
    anp1 = 1.;
776
	anp1 = 1.,
781
    bnp1 = c / c1;
777
	bnp1 = c / c1,
782
    r = c1 / c;
778
	r = c1 / c,
-
 
779
	r0; // := prev r;
783
 
780
 
784
/*        CONTINUED FRACTION CALCULATION */
781
/*        CONTINUED FRACTION CALCULATION */
785
 
-
 
-
 
782
#define bfrac_MAXIT 1000 // was 10000, but have never seen 1000 close to needed
786
    do {
783
    do {
787
	n += 1.;
784
	n += 1.;
-
 
785
	double w = n * x * (b - n); /* overflows when b is almost DBL_MAX ! */
788
	t = n / a;
786
	bool rescale = !R_FINITE(w);
-
 
787
	/* rescale w  <==> rescaled (alpha, beta) with same factor;
-
 
788
	   alpha (proportional) w  is automatically scaled, and beta needs explicit scaling */
-
 
789
	if(rescale) w = n * x * ldexp(b - n, -20);
789
	w = n * (b - n) * x;
790
	double t = n / a,
790
	e = a / s;
791
	    e = a / s,
791
	alpha = p * (p + c0) * e * e * (w * x);
792
	    alpha = p * (p + c0) * e * e * (w * x), beta;
-
 
793
#ifdef DEBUG_bfrac_it
-
 
794
	if(n == 1.) REprintf("\n");
-
 
795
	R_ifDEBUG_printf(" n=%4.0f, w=%12g, e=%12g, alpha=%g; ", n, w, e, alpha);
-
 
796
	if(rescale) REprintf("_rescaled_, ");
-
 
797
#endif
792
	e = (t + 1.) / (c1 + t + t);
798
	e = (t + 1.) / (c1 + t + t);
-
 
799
	beta = w / s + ((rescale) ? ldexp(n + e * (c + n * yp1), -20)
793
	beta = n + w / s + e * (c + n * yp1);
800
			          :       n + e * (c + n * yp1));
-
 
801
#ifdef DEBUG_bfrac_it
-
 
802
	R_ifDEBUG_printf("new e=%12g, beta=%12g\n", e, beta);
-
 
803
#endif
794
	p = t + 1.;
804
	p = t + 1.;
795
	s += 2.;
805
	s += 2.;
796
 
806
 
797
	/* update an, bn, anp1, and bnp1 */
807
	/* update an, bn, anp1, and bnp1 */
798
 
808
 
799
	t = alpha * an + beta * anp1;	an = anp1;	anp1 = t;
809
	t = alpha * an + beta * anp1;	an = anp1;	anp1 = t;
800
	t = alpha * bn + beta * bnp1;	bn = bnp1;	bnp1 = t;
810
	t = alpha * bn + beta * bnp1;	bn = bnp1;	bnp1 = t;
801
 
811
 
802
	r0 = r;
812
	r0 = r;
803
	r = anp1 / bnp1;
813
	r = anp1 / bnp1;
804
#ifdef _not_normally_DEBUG_bfrac
814
#ifdef DEBUG_bfrac_it
-
 
815
	R_ifDEBUG_printf(
805
	R_ifDEBUG_printf(" n=%5.0f, a_{n,n+1}= (%12g,%12g),  b_{n,n+1} = (%12g,%12g) => r0,r = (%14g,%14g)\n",
816
	"         ==> a_{n,n+1}= (%12g,%12g), b_{n,n+1} = (%12g,%12g) => r0,r = (%.14g,%.14g)\n",
806
			 n, an,anp1, bn,bnp1, r0, r);
817
			 an,anp1, bn,bnp1, r0, r);
807
#endif
818
#endif
808
	if (fabs(r - r0) <= eps * r)
819
	if (fabs(r - r0) <= eps * r)
809
	    break;
820
	    break;
810
 
821
 
811
	/* rescale an, bn, anp1, and bnp1 */
822
	/* rescale an, bn, anp1, and bnp1 */
812
 
823
 
813
	an /= bnp1;
824
	an /= bnp1;
814
	bn /= bnp1;
825
	bn /= bnp1;
815
	anp1 = r;
826
	anp1 = r;
816
	bnp1 = 1.;
827
	bnp1 = 1.;
817
    } while (n < 10000);// arbitrary; had '1' --> infinite loop for  lambda = Inf
828
    } while (n < bfrac_MAXIT);// arbitrary; had '1' --> infinite loop for  lambda = Inf
818
    R_ifDEBUG_printf("  in bfrac(): n=%.0f terms cont.frac.; brc=%g, r=%g\n",
829
    R_ifDEBUG_printf("  in bfrac(): n=%.0f terms cont.frac.; brc=%g, r=%g\n",
819
		     n, brc, r);
830
		     n, brc, r);
820
    if(n >= 10000 && fabs(r - r0) > eps * r)
831
    if(n >= bfrac_MAXIT && fabs(r - r0) > eps * r)
821
	MATHLIB_WARNING5(
832
	MATHLIB_WARNING6(
822
	    " bfrac(a=%g, b=%g, x=%g, y=%g, lambda=%g) did *not* converge (in 10000 steps)\n",
833
	    " bfrac(a=%g, b=%g, x=%g, y=%g, lambda=%g) did *not* converge (in %d steps)\n",
823
	    a,b,x,y, lambda);
834
	    a,b,x,y, lambda, bfrac_MAXIT);
824
    return (log_p ? brc + log(r) : brc * r);
835
    return (log_p ? brc + log(r) : brc * r);
825
} /* bfrac */
836
} /* bfrac */
-
 
837
#undef bfrac_MAXIT
826
 
838
 
-
 
839
// only called once from bfrac()
827
static double brcomp(double a, double b, double x, double y, int log_p)
840
static double brcomp(double a, double b, double x, double y, int log_p)
828
{
841
{
829
/* -----------------------------------------------------------------------
842
/* -----------------------------------------------------------------------
830
 *		 Evaluation of x^a * y^b / Beta(a,b)
843
 *		 Evaluation of x^a * y^b / Beta(a,b)
831
 * ----------------------------------------------------------------------- */
844
 * ----------------------------------------------------------------------- */
832
 
845
 
833
    static double const__ = .398942280401433; /* == 1/sqrt(2*pi); */
-
 
834
    /* R has  M_1_SQRT_2PI , and M_LN_SQRT_2PI = ln(sqrt(2*pi)) = 0.918938.. */
-
 
835
    int i, n;
-
 
836
    double c, e, u, v, z, a0, b0, apb;
-
 
837
 
-
 
838
    if (x == 0. || y == 0.) {
846
    if (x == 0. || y == 0.) {
839
	return R_D__0;
847
	return R_D__0;
840
    }
848
    }
841
    a0 = min(a, b);
849
    double a0 = min(a, b);
842
    if (a0 < 8.) {
850
    if (a0 < 8.) {
843
	double lnx, lny;
851
	double lnx, lny;
844
	if (x <= .375) {
852
	if (x <= .375) {
845
	    lnx = log(x);
853
	    lnx = log(x);
846
	    lny = alnrel(-x);
854
	    lny = alnrel(-x);
847
	}
855
	}
848
	else {
-
 
849
	    if (y > .375) {
856
	else if (y > .375) {
850
		lnx = log(x);
857
	    lnx = log(x);
851
		lny = log(y);
858
	    lny = log(y);
852
	    } else {
859
	} else {
853
		lnx = alnrel(-y);
860
	    lnx = alnrel(-y);
854
		lny = log(y);
861
	    lny = log(y);
855
	    }
-
 
856
	}
862
	}
857
 
863
 
858
	z = a * lnx + b * lny;
864
	double z = a * lnx + b * lny;
859
	if (a0 >= 1.) {
865
	if (a0 >= 1.) {
860
	    z -= betaln(a, b);
866
	    z -= betaln(a, b);
861
	    return R_D_exp(z);
867
	    return R_D_exp(z);
862
	}
868
	}
863
 
869
	// else :
864
/* ----------------------------------------------------------------------- */
870
	/* ----------------------------------------------------------------------- */
865
/*		PROCEDURE FOR a < 1 OR b < 1 */
871
	/*		PROCEDURE FOR a < 1 OR b < 1 */
866
/* ----------------------------------------------------------------------- */
872
	/* ----------------------------------------------------------------------- */
867
 
-
 
868
	b0 = max(a, b);
873
	double b0 = max(a, b);
869
	if (b0 >= 8.) { /* L80: */
874
	if (b0 >= 8.) { /* L80: */
870
	    u = gamln1(a0) + algdiv(a0, b0);
875
	    double u = gamln1(a0) + algdiv(a0, b0);
871
 
-
 
872
	    return (log_p ? log(a0) + (z - u)  : a0 * exp(z - u));
876
	    return (log_p ? log(a0) + (z - u)  : a0 * exp(z - u));
873
	}
877
	}
874
	/* else : */
878
	/* else : */
875
 
-
 
876
	if (b0 <= 1.) { /*		algorithm for max(a,b) = b0 <= 1 */
879
	if (b0 <= 1.) { /*		algorithm for max(a,b) = b0 <= 1 */
877
 
-
 
878
	    double e_z = R_D_exp(z);
880
	    double e_z = R_D_exp(z);
879
 
-
 
880
	    if (!log_p && e_z == 0.) /* exp() underflow */
881
	    if (!log_p && e_z == 0.) /* exp() underflow */
881
		return 0.;
882
		return 0.;
882
 
883
 
883
	    apb = a + b;
884
	    double apb = a + b;
884
	    if (apb > 1.) {
885
	    if (apb > 1.) {
885
		u = a + b - 1.;
-
 
886
		z = (gam1(u) + 1.) / apb;
886
		z = (gam1(apb - 1.) + 1.) / apb;
887
	    } else {
887
	    } else {
888
		z = gam1(apb) + 1.;
888
		z = gam1(apb) + 1.;
889
	    }
889
	    }
890
 
-
 
891
	    c = (gam1(a) + 1.) * (gam1(b) + 1.) / z;
890
	    double c = (gam1(a) + 1.) * (gam1(b) + 1.) / z;
-
 
891
	    R_ifDEBUG_printf(" brcomp(), max(a,b) <= 1: (e_z, z, c) = (%g, %g, %g)\n",
-
 
892
			     e_z, z, c);
892
	    /* FIXME? log(a0*c)= log(a0)+ log(c) and that is improvable */
893
	    /* FIXME? log(a0*c)= log(a0)+ log(c) and that is improvable */
893
	    return (log_p
894
	    return (log_p
894
		    ? e_z + log(a0 * c) - log1p(a0/b0)
895
		    ? e_z + log(a0 * c) - log1p(a0/b0)
895
		    : e_z * (a0 * c) / (a0 / b0 + 1.));
896
		    : e_z *    (a0 * c) / (a0/b0 + 1.));
896
	}
897
	}
897
 
898
 
898
	/* else : 		  ALGORITHM FOR 1 < b0 < 8 */
899
	/* else : 		  ALGORITHM FOR 1 < b0 < 8 */
899
 
900
 
900
	u = gamln1(a0);
901
	double u = gamln1(a0);
901
	n = (int)(b0 - 1.);
902
	int n = (int)(b0 - 1.);
902
	if (n >= 1) {
903
	if (n >= 1) {
903
	    c = 1.;
904
	    double c = 1.;
904
	    for (i = 1; i <= n; ++i) {
905
	    for (int i = 1; i <= n; ++i) {
905
		b0 += -1.;
906
		b0 += -1.;
906
		c *= b0 / (a0 + b0);
907
		c *= b0 / (a0 + b0);
907
	    }
908
	    }
908
	    u = log(c) + u;
909
	    u = log(c) + u;
909
	}
910
	}
910
	z -= u;
911
	z -= u;
911
	b0 += -1.;
912
	b0 += -1.;
912
	apb = a0 + b0;
913
	double apb = a0 + b0, t;
913
	double t;
-
 
914
	if (apb > 1.) {
914
	if (apb > 1.) {
915
	    u = a0 + b0 - 1.;
915
	    u = a0 + b0 - 1.;
916
	    t = (gam1(u) + 1.) / apb;
916
	    t = (gam1(u) + 1.) / apb;
917
	} else {
917
	} else {
918
	    t = gam1(apb) + 1.;
918
	    t = gam1(apb) + 1.;
919
	}
919
	}
920
 
920
 
-
 
921
	R_ifDEBUG_printf(" brcomp(), 1 < b0 < 8: (z, t) = (%g, %g)\n", z, t);
921
	return (log_p
922
	return (log_p
922
		? log(a0) + z + log1p(gam1(b0))  - log(t)
923
		? log(a0) + z + log1p(gam1(b0))  - log(t)
923
		: a0 * exp(z) * (gam1(b0) + 1.) / t);
924
		: a0 * exp(z) * (gam1(b0) + 1.) / t);
924
 
925
 
925
    } else {
926
    } else {
926
/* ----------------------------------------------------------------------- */
927
/* ----------------------------------------------------------------------- */
927
/*		PROCEDURE FOR A >= 8 AND B >= 8 */
928
/*		PROCEDURE FOR a >= 8 AND b >= 8 */
928
/* ----------------------------------------------------------------------- */
929
/* ----------------------------------------------------------------------- */
-
 
930
	static double const__ = .398942280401433; /* == 1/sqrt(2*pi); */
-
 
931
	/* R has  M_1_SQRT_2PI , and M_LN_SQRT_2PI = ln(sqrt(2*pi)) = 0.918938.. */
929
	double h, x0, y0, lambda;
932
	double h, x0, y0, apb = a+b,
-
 
933
	    lambda = R_FINITE(apb) // be safe
-
 
934
	      ? ((a <= b) ? a - apb * x
-
 
935
 	                  : apb * y - b)
-
 
936
	      : a*y - b*x;
930
	if (a <= b) {
937
	if (a <= b) {
931
	    h = a / b;
938
	    h = a / b;
932
	    x0 = h / (h + 1.);
939
	    x0 = h  / (h + 1.);
933
	    y0 = 1. / (h + 1.);
940
	    y0 = 1. / (h + 1.);
934
	    lambda = a - (a + b) * x;
941
	    R_ifDEBUG_printf(" brcomp(8 <= a <= b): ");
935
	} else {
942
	} else {
936
	    h = b / a;
943
	    h = b / a;
937
	    x0 = 1. / (h + 1.);
944
	    x0 = 1. / (h + 1.);
938
	    y0 = h / (h + 1.);
945
	    y0 = h  / (h + 1.);
939
	    lambda = (a + b) * y - b;
946
	    R_ifDEBUG_printf(" brcomp(8 <= b < a): ");
940
	}
947
	}
941
 
948
 
942
	e = -lambda / a;
949
	double e = -lambda / a,  u, v, z;
943
	if (fabs(e) > .6)
950
	if (fabs(e) > .6)
944
	    u = e - log(x / x0);
951
	    u = e - log(x / x0);
945
	else
952
	else
946
	    u = rlog1(e);
953
	    u = rlog1(e);
947
 
954
 
Line 950... Line 957...
950
	    v = rlog1(e);
957
	    v = rlog1(e);
951
	else
958
	else
952
	    v = e - log(y / y0);
959
	    v = e - log(y / y0);
953
 
960
 
954
	z = log_p ? -(a * u + b * v) : exp(-(a * u + b * v));
961
	z = log_p ? -(a * u + b * v) : exp(-(a * u + b * v));
955
 
-
 
-
 
962
	R_ifDEBUG_printf(" brcomp(): (lambda => u, v => z) = (%g =>  %g, %g  => %g)\n",
-
 
963
			 lambda,  u, v,  z);
956
	return(log_p
964
	return(log_p
957
	       ? -M_LN_SQRT_2PI + .5*log(b * x0) + z - bcorr(a,b)
965
	       ? -M_LN_SQRT_2PI + .5*log(b * x0) + z - bcorr(a,b)
958
	       : const__ * sqrt(b * x0) * z * exp(-bcorr(a, b)));
966
	       : const__ * sqrt(b * x0) * z * exp(-bcorr(a, b)));
959
    }
967
    }
960
} /* brcomp */
968
} /* brcomp */
961
 
969
 
-
 
970
/* A version of brcomp() above,
962
// called only once from  bup(),  as   r = brcmp1(mu, a, b, x, y, FALSE) / a;
971
 *  called only once from  bup(),  as   r = brcmp1(mu, a, b, x, y, FALSE) / a;
963
//                        -----
972
 *                        ----- */
964
static double brcmp1(int mu, double a, double b, double x, double y, int give_log)
973
static double brcmp1(int mu, double a, double b, double x, double y, int give_log)
965
{
974
{
966
/* -----------------------------------------------------------------------
975
/* -----------------------------------------------------------------------
967
 *          Evaluation of    exp(mu) * x^a * y^b / beta(a,b)
976
 *          Evaluation of    exp(mu) * x^a * y^b / Beta(a,b)
968
 * ----------------------------------------------------------------------- */
977
 * --------------------------^^^^^^^^^------------------------------------ */
969
 
-
 
970
    static double const__ = .398942280401433; /* == 1/sqrt(2*pi); */
-
 
971
    /* R has  M_1_SQRT_2PI */
-
 
972
 
978
 
973
    /* Local variables */
-
 
974
    double c, t, u, v, z, a0, b0, apb;
-
 
975
 
-
 
976
    a0 = min(a,b);
979
    double a0 = min(a,b);
977
    if (a0 < 8.) {
980
    if (a0 < 8.) {
978
	double lnx, lny;
981
	double lnx, lny;
979
	if (x <= .375) {
982
	if (x <= .375) {
980
	    lnx = log(x);
983
	    lnx = log(x);
981
	    lny = alnrel(-x);
984
	    lny = alnrel(-x);
Line 987... Line 990...
987
	    lnx = alnrel(-y);
990
	    lnx = alnrel(-y);
988
	    lny = log(y);
991
	    lny = log(y);
989
	}
992
	}
990
 
993
 
991
	// L20:
994
	// L20:
992
	z = a * lnx + b * lny;
995
	double z = a * lnx + b * lny;
993
	if (a0 >= 1.) {
996
	if (a0 >= 1.) {
994
	    z -= betaln(a, b);
997
	    z -= betaln(a, b);
995
	    return esum(mu, z, give_log);
998
	    return esum(mu, z, give_log);
996
	}
999
	}
997
	// else :
1000
	// else :
998
	/* ----------------------------------------------------------------------- */
1001
	/* ----------------------------------------------------------------------- */
999
	/*              PROCEDURE FOR A < 1 OR B < 1 */
1002
	/*              PROCEDURE FOR a < 1 OR b < 1 */
1000
	/* ----------------------------------------------------------------------- */
1003
	/* ----------------------------------------------------------------------- */
1001
	// L30:
1004
	// L30:
1002
	b0 = max(a,b);
1005
	double b0 = max(a,b);
1003
	if (b0 >= 8.) {
1006
	if (b0 >= 8.) {
1004
	/* L80:                  ALGORITHM FOR b0 >= 8 */
1007
	/* L80:                  ALGORITHM FOR b0 >= 8 */
1005
	    u = gamln1(a0) + algdiv(a0, b0);
1008
	    double u = gamln1(a0) + algdiv(a0, b0);
1006
	    R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a0 < 1, b0 >= 8;  z=%.15g\n", z);
1009
	    R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a0 < 1, b0 >= 8;  z=%.15g\n", z);
1007
	    return give_log
1010
	    return give_log
1008
		? log(a0) + esum(mu, z - u, TRUE)
1011
		? log(a0) + esum(mu, z - u, TRUE)
1009
		:     a0  * esum(mu, z - u, FALSE);
1012
		:     a0  * esum(mu, z - u, FALSE);
1010
 
1013
 
Line 1012... Line 1015...
1012
	    //                   a0 < 1, b0 <= 1
1015
	    //                   a0 < 1, b0 <= 1
1013
	    double ans = esum(mu, z, give_log);
1016
	    double ans = esum(mu, z, give_log);
1014
	    if (ans == (give_log ? ML_NEGINF : 0.))
1017
	    if (ans == (give_log ? ML_NEGINF : 0.))
1015
		return ans;
1018
		return ans;
1016
 
1019
 
1017
	    apb = a + b;
1020
	    double apb = a + b, z;
1018
	    if (apb > 1.) {
1021
	    if (apb > 1.) { // L40:
1019
		// L40:
-
 
1020
		u = a + b - 1.;
-
 
1021
		z = (gam1(u) + 1.) / apb;
1022
		z = (gam1(apb - 1.) + 1.) / apb;
1022
	    } else {
1023
	    } else {
1023
		z = gam1(apb) + 1.;
1024
		z = gam1(apb) + 1.;
1024
	    }
1025
	    }
1025
	    // L50:
1026
	    // L50:
1026
	    c = give_log
1027
	    double c = give_log
1027
		? log1p(gam1(a)) + log1p(gam1(b)) - log(z)
1028
		? log1p(gam1(a)) + log1p(gam1(b)) - log(z)
1028
		: (gam1(a) + 1.) * (gam1(b) + 1.) / z;
1029
		: (gam1(a) + 1.) * (gam1(b) + 1.) / z;
1029
	    R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a0 < 1, b0 <= 1;  c=%.15g\n", c);
1030
	    R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a0 < 1, b0 <= 1;  c=%.15g\n", c);
1030
	    return give_log
1031
	    return give_log
1031
		? ans + log(a0) + c - log1p(a0 / b0)
1032
		? ans + log(a0) + c - log1p(a0 / b0)
1032
		: ans * (a0 * c) / (a0 / b0 + 1.);
1033
		: ans * (a0 * c) / (a0 / b0 + 1.);
1033
	}
1034
	}
1034
	// else:               algorithm for	a0 < 1 < b0 < 8
1035
	// else:               algorithm for	a0 < 1 < b0 < 8
1035
	// L60:
1036
	// L60:
1036
	u = gamln1(a0);
1037
	double u = gamln1(a0);
1037
	int n = (int)(b0 - 1.);
1038
	int n = (int)(b0 - 1.); // have n <= 6
1038
	if (n >= 1) {
1039
	if (n >= 1) {
1039
	    c = 1.;
1040
	    double c = 1.;
1040
	    for (int i = 1; i <= n; ++i) {
1041
	    for (int i = 1; i <= n; ++i) {
1041
		b0 += -1.;
1042
		b0 += -1.;
1042
		c *= b0 / (a0 + b0);
1043
		c *= b0 / (a0 + b0);
1043
		/* L61: */
1044
		/* L61: */
1044
	    }
1045
	    }
1045
	    u += log(c); // TODO?: log(c) = log( prod(...) ) =  sum( log(...) )
1046
	    u += log(c); // TODO?: log(c) = log( prod(...) ) =  sum( log(...) )
1046
	}
1047
	}
1047
	// L70:
1048
	// L70:
1048
	z -= u;
1049
	z -= u;
1049
	b0 += -1.;
1050
	b0 += -1.;
1050
	apb = a0 + b0;
1051
	double apb = a0 + b0, t;
1051
	if (apb > 1.) {
1052
	if (apb > 1.) {
1052
	    // L71:
1053
	    // L71:
1053
	    t = (gam1(apb - 1.) + 1.) / apb;
1054
	    t = (gam1(apb - 1.) + 1.) / apb;
1054
	} else {
1055
	} else {
1055
	    t = gam1(apb) + 1.;
1056
	    t = gam1(apb) + 1.;
Line 1063... Line 1064...
1063
    } else {
1064
    } else {
1064
 
1065
 
1065
/* ----------------------------------------------------------------------- */
1066
/* ----------------------------------------------------------------------- */
1066
/*              PROCEDURE FOR A >= 8 AND B >= 8 */
1067
/*              PROCEDURE FOR A >= 8 AND B >= 8 */
1067
/* ----------------------------------------------------------------------- */
1068
/* ----------------------------------------------------------------------- */
-
 
1069
	static double const__ = .398942280401433; /* == 1/sqrt(2*pi); */
-
 
1070
	/* R has  M_1_SQRT_2PI , and M_LN_SQRT_2PI = ln(sqrt(2*pi)) = 0.918938.. */
1068
	// L100:
1071
	// L100:
1069
	double h, x0, y0, lambda;
1072
	double h, x0, y0, apb = a+b,
-
 
1073
	    lambda = R_FINITE(apb) // be safe
-
 
1074
	      ? ((a <= b) ? a - apb * x
-
 
1075
 	                  : apb * y - b)
-
 
1076
	      : a*y - b*x;
1070
	if (a > b) {
1077
	if (a > b) {
1071
	    // L101:
1078
	    // L101:
1072
	    h = b / a;
1079
	    h = b / a;
1073
	    x0 = 1. / (h + 1.);// => lx0 := log(x0) = 0 - log1p(h)
1080
	    x0 = 1. / (h + 1.);// => lx0 := log(x0) = 0 - log1p(h)
1074
	    y0 = h / (h + 1.);
1081
	    y0 = h  / (h + 1.);
1075
	    lambda = (a + b) * y - b;
-
 
1076
	} else {
1082
	} else {
1077
	    h = a / b;
1083
	    h = a / b;
1078
	    x0 = h / (h + 1.);  // => lx0 := log(x0) = - log1p(1/h)
1084
	    x0 = h  / (h + 1.);  // => lx0 := log(x0) = - log1p(1/h)
1079
	    y0 = 1. / (h + 1.);
1085
	    y0 = 1. / (h + 1.);
1080
	    lambda = a - (a + b) * x;
-
 
1081
	}
1086
	}
1082
	double lx0 = -log1p(b/a); // in both cases
1087
	double lx0 = -log1p(b/a); // in both cases
1083
 
1088
 
1084
	R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a,b >= 8;	x0=%.15g, lx0=log(x0)=%.15g\n",
1089
	R_ifDEBUG_printf(" brcmp1(mu,a,b,*): a,b >= 8;	x0=%.15g, lx0=log(x0)=%.15g\n",
1085
			 x0, lx0);
1090
			 x0, lx0);
1086
	// L110:
1091
	// L110:
1087
	double e = -lambda / a;
1092
	double e = -lambda / a,  u, v, z;
1088
	if (fabs(e) > 0.6) {
1093
	if (fabs(e) > 0.6) {
1089
	    // L111:
1094
	    // L111:
1090
	    u = e - log(x / x0);
1095
	    u = e - log(x / x0);
1091
	} else {
1096
	} else {
1092
	    u = rlog1(e);
1097
	    u = rlog1(e);
Line 1207... Line 1212...
1207
	    /* L_Error:    THE EXPANSION CANNOT BE COMPUTED */ *ierr = 3; return;
1212
	    /* L_Error:    THE EXPANSION CANNOT BE COMPUTED */ *ierr = 3; return;
1208
	}
1213
	}
1209
	if (fabs(dj) <= eps * (sum + l)) {
1214
	if (fabs(dj) <= eps * (sum + l)) {
1210
	    *ierr = 0;
1215
	    *ierr = 0;
1211
	    break;
1216
	    break;
1212
	} else if(n == n_terms_bgrat) { // never? ; please notify R-core if seen:
1217
	} else if(n == n_terms_bgrat) { // e.g. from pbeta(..., 0.001, 1e200)
1213
	    *ierr = 4;
1218
	    *ierr = 4;
1214
	    MATHLIB_WARNING5(
1219
	    MATHLIB_WARNING5(
1215
	"bgrat(a=%g, b=%g, x=%g) *no* convergence: NOTIFY R-core!\n dj=%g, rel.err=%g\n",
1220
	"bgrat(a=%g, b=%g, x=%.12g) *no* convergence: NOTIFY R-core!\n dj=%g, rel.err=%g\n",
1216
		a,b,x, dj, fabs(dj) /(sum + l));
1221
		a,b,x, dj, fabs(dj) /(sum + l));
1217
	}
1222
	}
1218
    } // for(n .. n_terms..)
1223
    } // for(n .. n_terms..)
1219
 
1224
 
1220
/*                    ADD THE RESULTS TO W */
1225
/*                    ADD THE RESULTS TO W */
Line 1331... Line 1336...
1331
 
1336
 
1332
static double basym(double a, double b, double lambda, double eps, int log_p)
1337
static double basym(double a, double b, double lambda, double eps, int log_p)
1333
{
1338
{
1334
/* ----------------------------------------------------------------------- */
1339
/* ----------------------------------------------------------------------- */
1335
/*     ASYMPTOTIC EXPANSION FOR I_x(A,B) FOR LARGE A AND B. */
1340
/*     ASYMPTOTIC EXPANSION FOR I_x(A,B) FOR LARGE A AND B. */
1336
/*     LAMBDA = (A + B)*Y - B  AND EPS IS THE TOLERANCE USED. */
1341
/*    lambda := a y - b x  = (a + b)y - b  =  a - (a+b)x    {using x + y == 1},
1337
/*     IT IS ASSUMED THAT LAMBDA IS NONNEGATIVE AND THAT */
1342
 *                             and eps is the tolerance used.
1338
/*     A AND B ARE GREATER THAN OR EQUAL TO 15. */
1343
 *     It is assumed that   lambda >= 0 , i.e., x <= a/(a+b), and both  a, b  >= 15   */
1339
/* ----------------------------------------------------------------------- */
1344
/* ----------------------------------------------------------------------- */
1340
 
1345
 
1341
 
1346
 
1342
/* ------------------------ */
1347
/* ------------------------ */
1343
/*     ****** NUM IS THE MAXIMUM VALUE THAT N CAN TAKE IN THE DO LOOP */
1348
/*     ****** NUM IS THE MAXIMUM VALUE THAT N CAN TAKE IN THE DO LOOP */
Line 1740... Line 1745...
1740
{
1745
{
1741
/*     ------------------------------------------------------------------ */
1746
/*     ------------------------------------------------------------------ */
1742
/*     COMPUTATION OF 1/GAMMA(A+1) - 1  FOR -0.5 <= A <= 1.5 */
1747
/*     COMPUTATION OF 1/GAMMA(A+1) - 1  FOR -0.5 <= A <= 1.5 */
1743
/*     ------------------------------------------------------------------ */
1748
/*     ------------------------------------------------------------------ */
1744
 
1749
 
1745
    double d, t, w, bot, top;
1750
    double d = a - 0.5;
-
 
1751
    // t := if(a > 1/2)  a-1  else  a  ==>  in [-0.5, 0.5]  <==>  |t| <= 0.5
-
 
1752
    double t = (d > 0.) ? d - 0.5 : a;
1746
 
1753
 
1747
    t = a;
-
 
1748
    d = a - 0.5;
1754
    double w, bot, top;
1749
    // t := if(a > 1/2)  a-1  else  a
-
 
1750
    if (d > 0.)
-
 
1751
	t = d - 0.5;
-
 
1752
    if (t < 0.) { /* L30: */
1755
    if (t < 0.) { /* L30: */
1753
	static double
1756
	static double
1754
	    r[9] = { -.422784335098468,-.771330383816272,
1757
	    r[9] = { -.422784335098468,-.771330383816272,
1755
		     -.244757765222226,.118378989872749,9.30357293360349e-4,
1758
		     -.244757765222226,.118378989872749,9.30357293360349e-4,
1756
		     -.0118290993445146,.00223047661158249,2.66505979058923e-4,
1759
		     -.0118290993445146,.00223047661158249,2.66505979058923e-4,
Line 2175... Line 2178...
2175
/*                SET s<n> := (1 - x^n)/(1 - x) */
2178
/*                SET s<n> := (1 - x^n)/(1 - x) */
2176
    s3 = x + x2 + 1.;
2179
    s3 = x + x2 + 1.;
2177
    s5 = x + x2 * s3 + 1.;
2180
    s5 = x + x2 * s3 + 1.;
2178
    s7 = x + x2 * s5 + 1.;
2181
    s7 = x + x2 * s5 + 1.;
2179
    s9 = x + x2 * s7 + 1.;
2182
    s9 = x + x2 * s7 + 1.;
2180
    s11 = x + x2 * s9 + 1.;
2183
    s11= x + x2 * s9 + 1.;
2181
 
2184
 
2182
/*                SET W = DEL(B) - DEL(A + B) */
2185
/*                SET W = DEL(B) - DEL(A + B) */
2183
 
2186
 
2184
    t = 1. / b; t *= t; // t := 1 / b^2
2187
    t = 1. / b; t *= t; // t := 1 / b^2
2185
    w = ((((c5 * s11 * t + c4 * s9) * t + c3 * s7) * t + c2 * s5) * t + c1 *
2188
    w = ((((c5 * s11 * t + c4 * s9) * t + c3 * s7) * t + c2 * s5) * t + c1 *