# Copyright 2000 by Jeffrey Chang. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. """This provides useful general math tools (DEPRECATED). This module and its C code equivalent are considered to be deprecated, and are likely to be removed in a future release of Biopython. Please get in touch via the mailing list if this will affect you. 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. """ import warnings warnings.warn("Bio.mathfns and its C code equivalent Bio.cmathfns are" \ +" deprecated, and will be removed in a future release of"\ +" Biopython. If you want to continue to use this code,"\ +" please get in contact with the Biopython developers via"\ +" the mailing lists to avoid its permanent removal from"\ +" Biopython.", \ DeprecationWarning) import math def fcmp(x, y, precision): """fcmp(x, y, precision) -> -1, 0, or 1""" if math.fabs(x-y) < precision: return 0 elif x < y: return -1 return 1 def intd(x, digits_after_decimal=0): """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. """ precision = 10.**digits_after_decimal if x >= 0: x = int(x * precision + 0.5) else: x = int(x * precision - 0.5) return x def safe_log(n, zero=None, neg=None): """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. """ if n < 0: return neg elif n < 1E-100: return zero return math.log(n) LOG2 = math.log(2) def safe_log2(n, zero=None, neg=None): """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. """ l = safe_log(n, zero=zero, neg=neg) if l is None: return l return l/LOG2 def safe_exp(n, under=None, over=None): """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. """ try: return math.exp(n) except OverflowError: if n < 0: return under return over raise "How did I get here?" # Try and load C implementations of functions. If I can't, # then just ignore and use the pure python implementations. try: from cmathfns import * except ImportError: pass