Ejemplo n.º 1
0
 def mpf_convert_rhs(cls, x):
     if isinstance(x, int_types): return from_int(x)
     if isinstance(x, float): return from_float(x)
     if isinstance(x, complex_types): return cls.context.mpc(x)
     if isinstance(x, rational.mpq):
         p, q = x
         return from_rational(p, q, cls.context.prec)
     if hasattr(x, '_mpf_'): return x._mpf_
     if hasattr(x, '_mpmath_'):
         t = cls.context.convert(x._mpmath_(*cls.context._prec_rounding))
         if hasattr(t, '_mpf_'):
             return t._mpf_
         return t
     return NotImplemented
Ejemplo n.º 2
0
 def mpf_convert_rhs(cls, x):
     if isinstance(x, int_types): return from_int(x)
     if isinstance(x, float): return from_float(x)
     if isinstance(x, complex_types): return cls.context.mpc(x)
     if isinstance(x, rational.mpq):
         p, q = x
         return from_rational(p, q, cls.context.prec)
     if hasattr(x, '_mpf_'): return x._mpf_
     if hasattr(x, '_mpmath_'):
         t = cls.context.convert(x._mpmath_(*cls.context._prec_rounding))
         if hasattr(t, '_mpf_'):
             return t._mpf_
         return t
     return NotImplemented
Ejemplo n.º 3
0
    def fraction(ctx, p, q):
        """
        Given Python integers `(p, q)`, returns a lazy ``mpf`` representing
        the fraction `p/q`. The value is updated with the precision.

            >>> from mpmath import *
            >>> mp.dps = 15
            >>> a = fraction(1,100)
            >>> b = mpf(1)/100
            >>> print a; print b
            0.01
            0.01
            >>> mp.dps = 30
            >>> print a; print b      # a will be accurate
            0.01
            0.0100000000000000002081668171172
            >>> mp.dps = 15
        """
        return ctx.constant(lambda prec, rnd: from_rational(p, q, prec, rnd), "%s/%s" % (p, q))
Ejemplo n.º 4
0
    def convert(ctx, x, strings=True):
        """
        Converts *x* to an ``mpf``, ``mpc`` or ``mpi``. If *x* is of type ``mpf``,
        ``mpc``, ``int``, ``float``, ``complex``, the conversion
        will be performed losslessly.

        If *x* is a string, the result will be rounded to the present
        working precision. Strings representing fractions or complex
        numbers are permitted.

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> mpmathify(3.5)
            mpf('3.5')
            >>> mpmathify('2.1')
            mpf('2.1000000000000001')
            >>> mpmathify('3/4')
            mpf('0.75')
            >>> mpmathify('2+3j')
            mpc(real='2.0', imag='3.0')

        """
        if type(x) in ctx.types: return x
        if isinstance(x, int_types): return ctx.make_mpf(from_int(x))
        if isinstance(x, float): return ctx.make_mpf(from_float(x))
        if isinstance(x, complex):
            return ctx.make_mpc((from_float(x.real), from_float(x.imag)))
        prec, rounding = ctx._prec_rounding
        if isinstance(x, rational.mpq):
            p, q = x
            return ctx.make_mpf(from_rational(p, q, prec))
        if strings and isinstance(x, basestring):
            try:
                _mpf_ = from_str(x, prec, rounding)
                return ctx.make_mpf(_mpf_)
            except ValueError:
                pass
        if hasattr(x, '_mpf_'): return ctx.make_mpf(x._mpf_)
        if hasattr(x, '_mpc_'): return ctx.make_mpc(x._mpc_)
        if hasattr(x, '_mpmath_'):
            return ctx.convert(x._mpmath_(prec, rounding))
        return ctx._convert_fallback(x, strings)
Ejemplo n.º 5
0
    def convert(ctx, x, strings=True):
        """
        Converts *x* to an ``mpf``, ``mpc`` or ``mpi``. If *x* is of type ``mpf``,
        ``mpc``, ``int``, ``float``, ``complex``, the conversion
        will be performed losslessly.

        If *x* is a string, the result will be rounded to the present
        working precision. Strings representing fractions or complex
        numbers are permitted.

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> mpmathify(3.5)
            mpf('3.5')
            >>> mpmathify('2.1')
            mpf('2.1000000000000001')
            >>> mpmathify('3/4')
            mpf('0.75')
            >>> mpmathify('2+3j')
            mpc(real='2.0', imag='3.0')

        """
        if type(x) in ctx.types: return x
        if isinstance(x, int_types): return ctx.make_mpf(from_int(x))
        if isinstance(x, float): return ctx.make_mpf(from_float(x))
        if isinstance(x, complex):
            return ctx.make_mpc((from_float(x.real), from_float(x.imag)))
        prec, rounding = ctx._prec_rounding
        if isinstance(x, rational.mpq):
            p, q = x
            return ctx.make_mpf(from_rational(p, q, prec))
        if strings and isinstance(x, basestring):
            try:
                _mpf_ = from_str(x, prec, rounding)
                return ctx.make_mpf(_mpf_)
            except ValueError:
                pass
        if hasattr(x, '_mpf_'): return ctx.make_mpf(x._mpf_)
        if hasattr(x, '_mpc_'): return ctx.make_mpc(x._mpc_)
        if hasattr(x, '_mpmath_'):
            return ctx.convert(x._mpmath_(prec, rounding))
        return ctx._convert_fallback(x, strings)
Ejemplo n.º 6
0
    def fraction(ctx, p, q):
        """
        Given Python integers `(p, q)`, returns a lazy ``mpf`` representing
        the fraction `p/q`. The value is updated with the precision.

            >>> from mpmath import *
            >>> mp.dps = 15
            >>> a = fraction(1,100)
            >>> b = mpf(1)/100
            >>> print a; print b
            0.01
            0.01
            >>> mp.dps = 30
            >>> print a; print b      # a will be accurate
            0.01
            0.0100000000000000002081668171172
            >>> mp.dps = 15
        """
        return ctx.constant(lambda prec, rnd: from_rational(p, q, prec, rnd),
            '%s/%s' % (p, q))
Ejemplo n.º 7
0
 def _mpq(ctx, pq):
     p, q = pq
     a = libmp.from_rational(p, q, ctx.prec, round_floor)
     b = libmp.from_rational(p, q, ctx.prec, round_ceiling)
     return ctx.make_mpf((a, b))
Ejemplo n.º 8
0
 def _mpq(ctx, pq):
     p, q = pq
     a = libmp.from_rational(p, q, ctx.prec, round_floor)
     b = libmp.from_rational(p, q, ctx.prec, round_ceiling)
     return ctx.make_mpf((a, b))