예제 #1
0
파일: number.py 프로젝트: denfromufa/hcpy
 def __call__(self, s):
     assert len(s) > 0
     suffix = 1
     if s != "now" and s != "today":
         if len(s) > 1 and s[:2] != "0x":
             if s[-1] in suffixes_ln:
                 exponent = suffixes_ln[s[-1]]
                 if exponent >= 0:
                     suffix = Zn(10**exponent)
                 else:
                     suffix = mpf("1e" + str(exponent))
                 s = s[:-1]
     for func in (self.j, self.i, self.q, self.v, self.r, self.c):
         x = func(s)
         if x != None: 
             if suffix == 1:
                 return x
             if isint(x):
                 if isint(suffix): return Zn(suffix*x)
                 else:             return suffix*mpf(int(x))
             elif isinstance(x, Rational):
                 if isint(suffix): return Rational(suffix*x.n, x.d)
                 else:             return suffix*x.mpf()
             elif isinstance(x, mpf) or \
                  isinstance(x, mpc) or \
                  isinstance(x, mpi):
                 if isint(suffix): return mpf(int(suffix))*x
                 else:             return suffix*x
             else:
                 return None
     return None
예제 #2
0
파일: rational.py 프로젝트: denfromufa/hcpy
def gcd(a, b):
    '''Determine the greatest common divisor of integers u and v.
    Euclid's algorithm from Knuth, vol 2, pg 320.
    '''
    if not isint(a) or not isint(b):
        raise ValueError("Arguments must be integers")
    a, b = int(a), int(b)
    if a == 0:  return b
    if b == 0:  return a
    while b != 0:
        a, b = b, a % b
    return a
예제 #3
0
파일: convert.py 프로젝트: denfromufa/hcpy
def Convert(x, arg_type, digits=0):
    '''Converts amongst the numerical types.  Some conversions lose 
    information.  The digits argument controls the precision of a conversion
    of a real to a rational.
    '''
    e = SyntaxError("Unknown type")
    if arg_type == INT:
        if isint(x):                  return Zn(x)
        elif isinstance(x, Rational): return Zn(int(mpf(x.n)/mpf(x.d)))
        elif isinstance(x, mpf):      return Zn(int(x))
        elif isinstance(x, mpc):      return Zn(int(abs(x)))
        elif isinstance(x, mpi):      return Zn(int(x.mid))
        elif isinstance(x, Julian):   return Zn(int(x))
        else: raise e
    elif arg_type == RAT:
        if isint(x):                  return Rational(int(x), 1)
        elif isinstance(x, Rational): return x
        elif isinstance(x, mpf):      return Rational().frac(x, digits)
        elif isinstance(x, mpc):      return Rational().frac(abs(x), digits)
        elif isinstance(x, mpi):      return Rational(x.mid)
        elif isinstance(x, Julian):   return Rational().frac(x.to_mpf(), digits)
        else: raise e
    elif arg_type == MPF:
        if isint(x):                  return mpf(int(x))
        elif isinstance(x, Rational): return x.mpf()
        elif isinstance(x, mpf):      return x
        elif isinstance(x, mpc):      return abs(x)
        elif isinstance(x, mpi):      return x.mid
        elif isinstance(x, Julian):   return x.to_mpf()
        else: raise e
    elif arg_type == MPC:
        if isint(x):                  return mpc(int(x))
        elif isinstance(x, Rational): return x.mpc()
        elif isinstance(x, mpf):      return mpc(x, 0)
        elif isinstance(x, mpc):      return x
        elif isinstance(x, mpi):      return mpc(x.mid, 0)
        elif isinstance(x, Julian):   return mpc(x.to_mpf(), 0)
        else: raise e
    elif arg_type == MPI:
        if isint(x):                  return mpi(int(x))
        elif isinstance(x, Rational): return x.mpi()
        elif isinstance(x, mpf):      return mpi(x)
        elif isinstance(x, mpc):      return mpi(abs(x))
        elif isinstance(x, mpi):      return x
        elif isinstance(x, Julian):
            if isinstance(x.value, mpf):  return mpi(x.value)
            else:                         return x.value
        else: raise e
    elif arg_type == JUL:
        if isint(x):                  return Julian(int(x))
        elif isinstance(x, Rational): return Julian(mpf(x.n)/mpf(x.d))
        elif isinstance(x, mpf):      return Julian(x)
        elif isinstance(x, mpc):      return Julian(abs(x))
        elif isinstance(x, mpi):      return Julian(x)
        elif isinstance(x, Julian):   return x
        else: raise e
    else:
        raise SyntaxError("Unknown type")