Example #1
0
 def test_log1p(self):
     """log1p should give same results as cephes"""
     p_s = [1e-10, 1e-5, 0.1, 0.8, 0.9, 0.95, 0.999, 0.9999999, 1,
            1.000000001, 1.01, 2]
     exp = [9.9999999995e-11, 9.99995000033e-06, 0.0953101798043,
            0.587786664902, 0.641853886172, 0.667829372576, 0.692647055518,
            0.69314713056, 0.69314718056, 0.69314718106, 0.698134722071,
            1.09861228867, ]
     for p, e in zip(p_s, exp):
         np.testing.assert_allclose(log1p(p), e)
Example #2
0
 def test_log1p(self):
     """log1p should give same results as cephes"""
     p_s = [
         1e-10, 1e-5, 0.1, 0.8, 0.9, 0.95, 0.999, 0.9999999, 1, 1.000000001,
         1.01, 2
     ]
     exp = [
         9.9999999995e-11,
         9.99995000033e-06,
         0.0953101798043,
         0.587786664902,
         0.641853886172,
         0.667829372576,
         0.692647055518,
         0.69314713056,
         0.69314718056,
         0.69314718106,
         0.698134722071,
         1.09861228867,
     ]
     for p, e in zip(p_s, exp):
         np.testing.assert_allclose(log1p(p), e)
Example #3
0
def bdtrc(k, n, p):
    """Complement of binomial distribution, k+1 through n.

    Uses formula bdtrc(k, n, p) = betai(k+1, n-k, p)

    See Cephes docs for details.
    """
    p = fix_rounding_error(p)
    if (p < 0) or (p > 1):
        raise ValueError("Binomial p must be between 0 and 1.")
    if (k < 0) or (n < k):
        raise ValueError("Binomial k must be between 0 and n.")
    if k == n:
        return 0
    dn = n - k
    if k == 0:
        if p < .01:
            dk = -expm1(dn * log1p(-p))
        else:
            dk = 1 - pow(1.0 - p, dn)
    else:
        dk = k + 1
        dk = betai(dk, dn, p)
    return dk
Example #4
0
def bdtrc(k, n, p):
    """Complement of binomial distribution, k+1 through n.

    Uses formula bdtrc(k, n, p) = betai(k+1, n-k, p)

    See Cephes docs for details.
    """
    p = fix_rounding_error(p)
    if (p < 0) or (p > 1):
        raise ValueError("Binomial p must be between 0 and 1.")
    if (k < 0) or (n < k):
        raise ValueError("Binomial k must be between 0 and n.")
    if k == n:
        return 0
    dn = n - k
    if k == 0:
        if p < .01:
            dk = -expm1(dn * log1p(-p))
        else:
            dk = 1 - pow(1.0 - p, dn)
    else:
        dk = k + 1
        dk = betai(dk, dn, p)
    return dk