Ticket #12557: trac_12557_fix_small_RDF_logs_v4.patch

File trac_12557_fix_small_RDF_logs_v4.patch, 2.6 KB (added by vbraun, 10 years ago)

Updated patch

  • sage/rings/real_double.pyx

    # HG changeset patch
    # User D. S. McNeil <dsm054@gmail.com>
    # Date 1337924458 14400
    # Node ID 23d577ebaa57001b83288e202c4411b13c173dc2
    # Parent  6285dcda57540e4d34f60379f9f87ccd92b3b4ed
    Trac #12557: Fix RDF logarithms of small numbers
    
    diff --git a/sage/rings/real_double.pyx b/sage/rings/real_double.pyx
    a b  
    16811681
    16821682
    16831683    cdef _log_base(self, double log_of_base):
    1684         if self._value < 2:
    1685             if self._value == 0:
    1686                 return RDF(-1)/RDF(0)
    1687             if self._value < 0:
    1688                 return RDF(0)/RDF(0)
    1689             sig_on()
    1690             a = self._new_c(gsl_sf_log_1plusx(self._value - 1) / log_of_base)
    1691             sig_off()
    1692             return a
     1684        if self._value == 0:
     1685            return RDF(-1)/RDF(0)
     1686        elif self._value < 0:
     1687            return RDF.NaN()
    16931688        sig_on()
    16941689        a = self._new_c(gsl_sf_log(self._value) / log_of_base)
    16951690        sig_off()
     
    16971692
    16981693    def log(self, base=None):
    16991694        """
     1695        Return the logarithm.
     1696
     1697        INPUT:
     1698
     1699        - ``base`` -- integer or ``None`` (default). The base of the
     1700          logarithm. If none is specified, the base is `e` (the so-called
     1701          natural logarithm).
     1702
     1703        OUTPUT:
     1704
     1705        The logarithm of ``self``.  If ``self`` is positive, a double
     1706        floating point number. Infinity if ``self`` is zero. A
     1707        imaginary complex floating point number if ``self`` is
     1708        negative.
     1709
    17001710        EXAMPLES::
    17011711       
    17021712            sage: RDF(2).log()
     
    17151725            3.14159265359*I
    17161726            sage: RDF(-1).log(2)
    17171727            4.53236014183*I
     1728
     1729        TESTS:
     1730
     1731        Make sure that we can take the log of small numbers accurately
     1732        and the fix doesn't break preexisting values (:trac:`12557`)::
     1733
     1734            sage: def check_error(x):
     1735            ...     x = RDF(x)
     1736            ...     log_RDF = x.log()
     1737            ...     log_exact = log(x.n(1000))
     1738            ...     return abs(log_RDF-log_exact) <= log_RDF.ulp()
     1739            sage: all( check_error(2^x) for x in range(-100,100) )
     1740            True
     1741            sage: all( check_error(x) for x in sxrange(0.01, 2.00, 0.01) )
     1742            True
     1743            sage: all( check_error(x) for x in sxrange(0.99, 1.01, 0.001) )
     1744            True
     1745            sage: RDF(1.000000001).log()
     1746            1.00000008224e-09
     1747            sage: RDF(1e-17).log()
     1748            -39.1439465809
     1749            sage: RDF(1e-50).log()
     1750            -115.12925465
    17181751        """
    17191752        if self < 0:
    17201753            from sage.rings.complex_double import CDF