2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-27 19:12:08 +00:00

Comments and checks that no return of infinity that should call overflow_error.

[SVN r3308]
This commit is contained in:
Paul A. Bristow
2006-10-24 17:58:30 +00:00
parent 25570182cb
commit 84bdaaa6ee

View File

@@ -189,11 +189,10 @@ namespace boost
return m_n;
}
// Estimation of the success parameter.
// The best estimate is actually simply
// successes/trials, these functions are used
// to obtain confidence intervals for the success
// fraction:
// Estimation of the success fraction parameter.
// The best estimate is actually simply successes/trials,
// these functions are used
// to obtain confidence intervals for the success fraction:
//
static RealType estimate_lower_bound_on_p(
RealType trials,
@@ -316,20 +315,18 @@ namespace boost
// Special cases of success_fraction, regardless of k successes and regardless of n trials.
if (dist.success_fraction() == 0)
{
// probability of zero successes is 1:
{ // probability of zero successes is 1:
return static_cast<RealType>(k == 0 ? 1 : 0);
}
if (dist.success_fraction() == 1)
{
// probability of n successes is 1:
{ // probability of n successes is 1:
return static_cast<RealType>(k == n ? 1 : 0);
}
// k argument may be integral, signed, or unsigned, or floating point.
// If necessary, it has already been promoted from an integral type.
if (n == 0)
{
return 1;
return 1; // Probability = 1 = certainty.
}
if (k == 0)
{ // binomial coeffic (n 0) = 1,
@@ -401,31 +398,33 @@ namespace boost
// Special cases, regardless of k.
if (p == 0)
{
// This need explanation: the pdf is zero for all
// cases except when k == 0. For zero p the probability
// of zero successes is one. Therefore the cdf is always
// 1: the probability of k or *fewer* successes is always 1
{ // This need explanation:
// the pdf is zero for all cases except when k == 0.
// For zero p the probability of zero successes is one.
// Therefore the cdf is always 1:
// the probability of k or *fewer* successes is always 1
// if there are never any successes!
return 1;
}
if (p == 1)
{
// This is correct but needs explanation, when k = 1
// all the cdf and pdf values are zero *except* when
// k == n, and that case has been handled above already.
{ // This is correct but needs explanation:
// when k = 1
// all the cdf and pdf values are zero *except* when k == n,
// and that case has been handled above already.
return 0;
}
if((k < 20) && (floor(k) == k))
if((k < 20) // Small (perhaps up to 34, the largest factorial for float).
&& (floor(k) == k)) // and integral.
{
// For small k use a finite sum, it's cheaper
// than the incomplete beta:
// For small k, use a finite sum of pdfs:
// it's cheaper than the incomplete beta:
RealType result = 0;
for(unsigned i = 0; i <= k; ++i)
result += pdf(dist, static_cast<RealType>(i));
return result;
}
// Calculate cdf binomial using the incomplete beta function.
// else for larger and non-integral k,
// calculate cdf binomial using the incomplete beta function.
// P = I[1-p](n - k, k + 1)
// = 1 - I[p](k + 1, n - k)
// Use of ibetac here prevents cancellation errors in calculating
@@ -475,8 +474,7 @@ namespace boost
}
if (k == n)
{
// Probability of greater than n successes is necessarily zero:
{ // Probability of greater than n successes is necessarily zero:
return 0;
}
@@ -553,24 +551,21 @@ namespace boost
{
return result;
}
//
// Special cases:
//
if(p == 0)
{
// There may actually be no answer to this question,
{ // There may actually be no answer to this question,
// since the probability of zero successes may be non-zero,
// but zero is the best we can do:
return 0;
}
if(p == 1)
{
// Probability of n or fewer successes is always one,
{ // Probability of n or fewer successes is always one,
// so n is the most sensible answer here:
return dist.trials();
}
//
// Solve for quantile numerically:
//
detail::binomial_functor<RealType> f(dist, p);
@@ -608,19 +603,17 @@ namespace boost
{
return result;
}
//
// Special cases:
//
if(q == 1)
{
// There may actually be no answer to this question,
{ // There may actually be no answer to this question,
// since the probability of zero successes may be non-zero,
// but zero is the best we can do:
return 0;
}
if(q == 0)
{
// probability of greater than n successes is always zero,
{ // probability of greater than n successes is always zero,
// so n is the most sensible answer here:
return dist.trials();
}