Ticket #10736: 10736-real-pow.patch

File 10736-real-pow.patch, 2.8 KB (added by Robert Bradshaw, 12 years ago)
  • sage/rings/real_mpfr.pyx

    # HG changeset patch
    # User Robert Bradshaw <robertwb@math.washington.edu>
    # Date 1297990984 28800
    # Node ID 701a4ff1f2b8cbb3ef6bed94f27727b5ba142059
    # Parent  8d9cab35219229bccfd717716f3c5a31fa3ea7e8
    #10736 - int raised to a RealNumber gives an error
    
    diff -r 8d9cab352192 -r 701a4ff1f2b8 sage/rings/real_mpfr.pyx
    a b  
    123123cimport sage.structure.element
    124124from sage.structure.element cimport RingElement, Element, ModuleElement
    125125import  sage.structure.element
     126cdef bin_op
     127from sage.structure.element import bin_op
    126128
    127129import sage.misc.misc as misc
    128130
     
    34973499            1.50000000000000^x
    34983500            sage: -2.3^(x+y^3+sin(x))
    34993501            -2.30000000000000^(y^3 + x + sin(x))
    3500         """
    3501         cdef RealNumber x
    3502         if not PY_TYPE_CHECK(self, RealNumber):
    3503             return self.__pow__(float(exponent))
    3504         if not PY_TYPE_CHECK(exponent, RealNumber):
    3505             try:
    3506                 x = self
    3507                 exponent = x._parent(exponent)
    3508             except TypeError:
    3509                 try:
    3510                     return exponent.parent()(self)**exponent
    3511                 except AttributeError:
    3512                     raise TypeError
    3513         return self.__pow(exponent)
     3502       
     3503        We see that track #10736 is fixed::
     3504       
     3505            sage: 16^0.5
     3506            4.00000000000000
     3507            sage: int(16)^0.5
     3508            4.00000000000000
     3509            sage: (1/2)^2.0
     3510            0.250000000000000
     3511            sage: [n^(1.5) for n in range(10)]
     3512            [0.000000000000000, 1.00000000000000, 2.82842712474619, 5.19615242270663, 8.00000000000000, 11.1803398874989, 14.6969384566991, 18.5202591774521, 22.6274169979695, 27.0000000000000]
     3513        """
     3514        cdef RealNumber base, x
     3515        cdef mpfr_rnd_t rounding_mode
     3516        if PY_TYPE_CHECK(self, RealNumber):
     3517            base = <RealNumber>self
     3518            rounding_mode = (<RealField_class>base._parent).rnd
     3519            x = base._new()
     3520            _sig_on
     3521            if PY_TYPE_CHECK(exponent, int):
     3522                mpfr_pow_si(x.value, base.value, exponent, rounding_mode)
     3523            elif PY_TYPE_CHECK(exponent, Integer):
     3524                mpfr_pow_z(x.value, base.value, (<Integer>exponent).value, rounding_mode)
     3525            elif PY_TYPE_CHECK(exponent, RealNumber):
     3526                mpfr_pow(x.value, base.value, (<RealNumber>exponent).value, rounding_mode)
     3527            else:
     3528                _sig_off
     3529                return bin_op(self, exponent, operator.pow)
     3530            _sig_off
     3531            if mpfr_nan_p(x.value):
     3532                return base._complex_number_() ** exponent
     3533            return x
     3534        else:
     3535            return bin_op(self, exponent, operator.pow)
    35143536
    35153537    def log(self, base='e'):
    35163538        """