*λ
ΈΑD;c       s¬     d  Z    d k Z  d   Z  d d  Z ) e e d  Z 6 e i d  Z 7 e e d  Z C e e d  Z	 T y U d	 k
 TWn V e j
 o
 W n Xd S(
   sL  This provides useful general math tools.

Functions:
fcmp       Compare two floating point numbers, up to a specified precision.
intd       Represent a floating point number as an integer.
safe_log   log, but returns an arbitrarily small number for log(0).
safe_exp   exp, but returns a large or small number instead of overflows.

Nc    sU      t  i |  |  | j  o  d Sn  |  | j  o  d Sn  d Sd S(   s$   fcmp(x, y, precision) -> -1, 0, or 1i    i   N(   s   maths   fabss   xs   ys	   precision(   s   xs   ys	   precision(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys   fcmp s   i    c    s`    ! " d | } # |  d j o $ t |  | d  }  n & t |  | d  }  ' |  Sd S(   s  intd(x[, digits_after_decimal]) -> int x, rounded

    Represent a floating point number with some digits after the
    decimal point as an integer.  This is useful when floating point
    comparisons are failing due to precision problems.  e.g.
    intd(5.35, 1) -> 54.

    f10.0i    f0.5N(   s   digits_after_decimals	   precisions   xs   int(   s   xs   digits_after_decimals	   precision(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys   intd s   c    sP   ) / 0 |  d j  o 1 | Sn 2 |  d j  o 3 | Sn 4 t i |   Sd S(   s₯   safe_log(n, zero=None, neg=None) -> log(n)

    Calculate the log of n.  If n is 0, returns the value of zero.  If n is
    negative, returns the value of neg.

    i    f1e-100N(   s   ns   negs   zeros   maths   log(   s   ns   zeros   neg(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys   safe_log) s   i   c    sK   7 = > t  |  d | d | } ? | t j o @ | Sn A | t Sd S(   s­   safe_log2(n, zero=None, neg=None) -> log(n)

    Calculate the log base 2 of n.  If n is 0, returns the value of
    zero.  If n is negative, returns the value of neg.

    s   zeros   negN(   s   safe_logs   ns   zeros   negs   ls   Nones   LOG2(   s   ns   zeros   negs   l(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys	   safe_log27 s
   c    se   C I J y K t  i |   SWn8 L t j
 o) M |  d j  o N | Sn O | Sn XP d  d S(   s·   safe_exp(n, under=None, over=None) -> e**n

    Guaranteed not to overflow.  Instead of overflowing, it returns
    the values of 'under' for underflows or 'over' for overflows.

    i    s   How did I get here?N(   s   maths   exps   ns   OverflowErrors   unders   over(   s   ns   unders   over(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys   safe_expC s   (   s   *(   s   __doc__s   maths   fcmps   intds   Nones   safe_logs   logs   LOG2s	   safe_log2s   safe_exps   cmathfnss   ImportError(   s   fcmps   safe_logs   safe_exps	   safe_log2s   maths   LOG2s   intd(    (    s*   /mit/seven/lib/python/Bio/Tools/mathfns.pys   ? s   