【问题标题】:Arbitrary precision of square roots平方根的任意精度
【发布时间】:2012-05-23 18:09:46
【问题描述】:

decimal.Decimal(math.sqrt(2))屈服时我很失望

Decimal('1.4142135623730951454746218587388284504413604736328125')

小数点后 15 位后的数字是错误的。 (尽管很高兴给你超过 15 位数!)

如何在 Python 中获得 sqrt(n) 的十进制扩展中的第一个 m正确 位?

【问题讨论】:

  • 需要明确的是,精度损失发生在使用浮点的math.sqrt(2)。之后将其设为Decimal 并不能解决此问题。

标签: python math


【解决方案1】:

使用sqrt method on Decimal

>>> from decimal import *
>>> getcontext().prec = 100  # Change the precision
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')

【讨论】:

    【解决方案2】:

    你可以试试bigfloat。项目页面示例:

    from bigfloat import *
    sqrt(2, precision(100))  # compute sqrt(2) with 100 bits of precision
    

    【讨论】:

      【解决方案3】:

      IEEE 标准双精度浮点数只有 16 位精度。任何使用 IEEE 的软件/硬件都不能做得更好:

      http://en.wikipedia.org/wiki/IEEE_754-2008

      您需要一个特殊的 BigDecimal 类实现,并实现所有数学函数才能使用它。 Python有这样的东西:

      https://literateprograms.org/arbitrary-precision_elementary_mathematical_functions__python_.html

      【讨论】:

        【解决方案4】:

        如何在 Python 中获取 sqrt(n) 的十进制扩展中的前 m 个正确数字?

        一种方法是计算 integer square root 乘以所需的 10 的幂。例如,要查看 sqrt(2) 的前 20 位小数,您可以这样做:

        >>> from gmpy2 import isqrt
        >>> num = 2
        >>> prec = 20
        >>> isqrt(num * 10**(2*prec)))
        mpz(141421356237309504880)
        

        isqrt 函数实际上很容易使用维基百科页面上提供的算法自己实现。

        【讨论】:

        • 这正是decimal 模块计算Decimal(2).sqrt() 所做的工作。 :-)
        • @Mark:很高兴知道。虽然,上次我尝试它时,它比“手动”执行此操作要慢得多。
        • 是的,Python 2 的十进制模块是纯 Python,从来没有以速度着称。在 Python 3 中应该会好一些(或使用 Python 2 的 cdecimal PyPI backport)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        相关资源
        最近更新 更多