# This file is a crude replacement for the umath module # that comes with the numerics package. Use it only # if you do not have this package. This version implements # just the standard math functions for objects of arbitrary # types; it does not have any array functions. Note also # that it is a lot slower than the real "umath". # # For those who don't know anything about umath: # umath provides "universal math" functions for all types. # Python comes with a module "math" that offers the standard # math functions for floating-point numbers. But suppose you # define your own numeric type (complex numbers, automatic # derivatives, arrays, etc.). You can of course define # analogous functions for your new type, but then you # effectively have a *different* function to call for each # type (because they come from different modules). Which means # you can't write code that works for all types that support # a given set of functions. # umath provides the solution: When you call one of the # functions from umath, it first checks whether it "knows" # the type of the argument, and then it calls the appropriate # function. For any other type, it calls a method with the # same name. For example, if "x" is an object of a new # type defined as a Python class, then "sqrt(x)" gets # translated into "x.sqrt()". This enables all new classes # to provide their own implementation for these functions. # The "real" umath from the numerics package knows about # integers, floats, complex numbers, and arrays of these # objects. This stripped-down (and slowed-down) version # knows only integers and floats # # Written by: Konrad Hinsen # Last revision: 1996-1-30 # import math, types class _umathfunc: def __init__(self, mathfunc, name): self.mathfunc = mathfunc self.name = name def __call__(self, arg): t = type(arg) if t == types.IntType or t == types.FloatType: return self.mathfunc(arg) else: return getattr(arg, self.name)() acos = _umathfunc(math.acos, "acos") asin = _umathfunc(math.asin, "asin") atan = _umathfunc(math.atan, "atan") cos = _umathfunc(math.cos, "cos") cosh = _umathfunc(math.cosh, "cosh") exp = _umathfunc(math.exp, "exp") fabs = _umathfunc(math.fabs, "fabs") log = _umathfunc(math.log, "log") log10 = _umathfunc(math.log10, "log10") pow = _umathfunc(math.pow, "pow") sin = _umathfunc(math.sin, "sin") sinh = _umathfunc(math.sinh, "sinh") sqrt = _umathfunc(math.sqrt, "sqrt") tan = _umathfunc(math.tan, "tan") tanh = _umathfunc(math.tanh, "tanh") e = math.e pi = math.pi