Units of measurement

Discussion in 'Python' started by Paul Rubin, Jan 17, 2007.

  1. Paul Rubin

    Paul Rubin Guest

    I'm sure this has been done before, but it just struck my fancy, an
    example of Python's "emulating numeric types", inspired by the old
    Unix "units" utility, and the Frink language. The language reference
    for these features is somewhat unclear and I'll enter some sourceforge
    items. Maybe I'll write a calculator-with-units around it. If I were
    really industrious, I'd attempt a Frink-like interpreter, but don't
    hold your breath.

    ================================================================

    try:
    set
    except NameError:
    from sets import Set as set # python 2.3 ...

    class Unit:
    def __init__(self, coef, dimensions):
    self.dimensions = dimensions
    self.coef = coef
    def __add__(self, other):
    if self.dimensions != other.dimensions:
    raise TypeError, ('dimension mismatch', self, other)
    return Unit(self.coef + other.coef, self.dimensions)
    def __sub__(self,other):
    return self + (-1.0) * other
    def __rmul__(self, x):
    return x*self
    def __rdiv__(self, x):
    return x/self
    def __mul__(self, other):
    pc = self.coef * other.coef
    sd, od = self.dimensions, other.dimensions
    basis = set(sd.keys()) | set(od.keys())
    pa = [(d, sd.get(d,0)+od.get(d,0)) for d in basis]
    pd = dict([(d,a) for d,a in pa if a != 0])
    return Unit(pc, pd)
    def __repr__(self):
    a = [repr(self.coef)]
    for d,c in self.dimensions.iteritems():
    s = str(d)
    if c != 1: s += '^'+str(c)
    a.append(s)
    return '*'.join(a)
    def __div__(self, other):
    od = other.dimensions
    inv = Unit(1.0 / other.coef,
    dict([(d, -od[d]) for d in od]))
    return self * inv
    def __pow__(self, n):
    n = n.coef
    if self.dimensions and type(n) not in (int,long):
    raise TypeError, ('exponent must be integer', self,n)
    cn = self.coef ** n
    sd = self.dimensions
    return Unit(self.coef ** n,
    dict([(d,sd[d]*n) for d in sd]))

    def __coerce__(self, other):
    if isinstance(other, Unit): return self, other
    return self, Unit(other, {})

    def __float__(self):
    if self.dimensions:
    raise TypeError, ('unit must be dimensionless for float cast', self)
    return float(self.coef)
    def __int__(self):
    return int(float(self))

    def base_unit(name):
    return Unit(1.0, {name : 1})

    meter = base_unit('m')
    second = base_unit('s')
    kg = base_unit('kg')
    coulomb = base_unit('coulomb')

    centimeter = meter / 100
    inch = 2.54 * centimeter
    foot = ft = 12 * inch
    mile = 5280*foot
    minute=60*second
    hour=60*minute
    speed_limit = 55 * mile / hour
    furlong = mile / 8
    day = 24 * hour
    fortnight = 14 * day
    # could include more units but you get the idea

    c = 186282*mile/second
    print 'speed of light =', c/(furlong/fortnight), 'furlongs per fortnight'
    # ...
     
    Paul Rubin, Jan 17, 2007
    #1
    1. Advertising

  2. Paul Rubin

    Robert Kern Guest

    Paul Rubin wrote:
    > I'm sure this has been done before, but it just struck my fancy, an
    > example of Python's "emulating numeric types", inspired by the old
    > Unix "units" utility, and the Frink language.


    Oh yeah, it's been done before. Several times over, in fact.

    Unum
    http://home.tiscali.be/be052320/Unum.html

    Caltech's pyre.units
    http://www.cacr.caltech.edu/projects/pyre/

    Konrad Hinsen's Scientific.Physics.PhysicalQuantity
    http://dirac.cnrs-orleans.fr/ScientificPython/

    Will Ware posted one to the list.
    http://groups.google.com/group/comp.lang.python/browse_frm/thread/8ed89844218b92c7/0f05aea353c1563d

    And there was another one announced here sometime in the past year or so, IIRC,
    but I don't recall the name of it or that of the author. :-(

    --
    Robert Kern

    "I have come to believe that the whole world is an enigma, a harmless enigma
    that is made terrible by our own mad attempt to interpret it as though it had
    an underlying truth."
    -- Umberto Eco
     
    Robert Kern, Jan 17, 2007
    #2
    1. Advertising

  3. Paul Rubin

    Russ Guest

    Robert Kern wrote:
    > Paul Rubin wrote:
    > > I'm sure this has been done before, but it just struck my fancy, an
    > > example of Python's "emulating numeric types", inspired by the old
    > > Unix "units" utility, and the Frink language.

    >
    > Oh yeah, it's been done before. Several times over, in fact.


    <cut>

    > And there was another one announced here sometime in the past year or so, IIRC,
    > but I don't recall the name of it or that of the author. :-(


    Perhaps you are referring to the scalar class at
    http://RussP.us/scalar.htm

    The nice thing about this one (which I wrote myself) is that after you
    do your development and are ready for "production" runs, you can easily
    disable the unit checks and get the efficiency of built-in numeric
    types. That can be two orders of magnitude faster!

    It comes with a complete user manual too (pdf and html). I'm using it
    for my engineering work, and it's working great!
     
    Russ, Jan 18, 2007
    #3
  4. Paul Rubin

    Robert Kern Guest

    Russ wrote:
    > Robert Kern wrote:


    >> And there was another one announced here sometime in the past year or so, IIRC,
    >> but I don't recall the name of it or that of the author. :-(

    >
    > Perhaps you are referring to the scalar class at
    > http://RussP.us/scalar.htm


    Yup, you're the one.

    --
    Robert Kern

    "I have come to believe that the whole world is an enigma, a harmless enigma
    that is made terrible by our own mad attempt to interpret it as though it had
    an underlying truth."
    -- Umberto Eco
     
    Robert Kern, Jan 18, 2007
    #4
  5. Paul Rubin

    Tim Roberts Guest

    Paul Rubin <http://> wrote:
    >
    >I'm sure this has been done before, but it just struck my fancy, an
    >example of Python's "emulating numeric types", inspired by the old
    >Unix "units" utility, and the Frink language.
    >...
    ># could include more units but you get the idea
    >...
    >c = 186282*mile/second
    >print 'speed of light =', c/(furlong/fortnight), 'furlongs per fortnight'
    ># ...


    I could not skip to the next message without cutting, pasting, and
    executing that script to find out what the speed of light actually was in
    furlongs per fortnight.

    Now I need to figure out how to work that into a cocktail party
    conversation. "Hey, the deficit isn't the only thing that is approaching
    1.8 trillion..."
    --
    Tim Roberts,
    Providenza & Boekelheide, Inc.
     
    Tim Roberts, Jan 19, 2007
    #5
  6. On Fri, 19 Jan 2007 08:35:59 GMT, Tim Roberts <> declaimed
    the following in comp.lang.python:


    > I could not skip to the next message without cutting, pasting, and
    > executing that script to find out what the speed of light actually was in
    > furlongs per fortnight.
    >

    Table 15.15 "Units of Length, Speed, and Mass" (page 716) in the
    "Explanatory Supplement to the Astronomical Almanac" includes that set
    of units for c in the footnote area...
    --
    Wulfraed Dennis Lee Bieber KD6MOG

    HTTP://wlfraed.home.netcom.com/
    (Bestiaria Support Staff: )
    HTTP://www.bestiaria.com/
     
    Dennis Lee Bieber, Jan 19, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?ISO-8859-1?Q?J=F6rg_Marti?=

    JPS 1.4: unit of measurement in the printDialog()

    =?ISO-8859-1?Q?J=F6rg_Marti?=, Aug 12, 2003, in forum: Java
    Replies:
    0
    Views:
    355
    =?ISO-8859-1?Q?J=F6rg_Marti?=
    Aug 12, 2003
  2. Reiner Funck

    memory-use measurement

    Reiner Funck, Nov 10, 2004, in forum: Java
    Replies:
    1
    Views:
    383
    Chris Smith
    Nov 10, 2004
  3. Replies:
    2
    Views:
    3,386
    muddi
    Dec 24, 2007
  4. tom fredriksen

    Re: bandwidth measurement

    tom fredriksen, Feb 14, 2006, in forum: Java
    Replies:
    0
    Views:
    396
    tom fredriksen
    Feb 14, 2006
  5. Robert Dodier
    Replies:
    2
    Views:
    387
    Stefan Ram
    Sep 15, 2006
Loading...

Share This Page