mpmath和精度问题

时间:2019-04-27 12:10:02

标签: python mpmath

mpmath.sqrt(2)的精度不是我所期望的。我在做什么错了?

结果:from bs4 import BeautifulSoup html = """ <html> <head></head> <body> <!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]--> <![endif]--> <a href="test"></a> <a href="test"></a> <a href="test"></a> <a href="test"></a> <!--[if lte IE 8]> <![endif]--> </body> </html> """ soup = BeautifulSoup(html, 'html.parser') tags = soup.find_all('a') print(tags)

预期:import mpmath as mp mp.prec = 20 mp.nprint(mp.sqrt(2), 20) (根据this reference

2 个答案:

答案 0 :(得分:0)

有趣的情况。使用python Decimal可以得到与您列出的参考相同的结果,但是使用floatmath.sqrt()似乎可以得到不同的结果。

>>> from decimal import Decimal
>>> '{:.25f}'.format(2**0.5)                            # Result 1
'1.4142135623730951454746219'
>>> '{:.25f}'.format(math.sqrt(2))                      # Result 1
'1.4142135623730951454746219'
>>> '{:.25f}'.format(math.sqrt(Decimal('2')))           # Result 1
'1.4142135623730951454746219'
>>> '{:.25f}'.format(Decimal('2') ** Decimal('0.5'))    # Result 2
'1.4142135623730950488016887'

# The reference you listed                              # Result 2
'1.4142135623730950488016887'

您的图书馆可能在内部使用float

但是我认为这是正常现象,不是错误,因为float并不意味着100%精确;它们本来可以在机器上快速运行。

答案 1 :(得分:0)

mp.prec是二进制精度。 mp.dps是小数点。

In [588]: mpmath.mp.dps=20                                                                       
In [589]: mpmath.sqrt(2)                                                                         
Out[589]: mpf('1.4142135623730950488011')

使用此设置:

In [590]: print(mpmath.mp)                                                                       
Mpmath settings:
  mp.prec = 70                [default: 53]
  mp.dps = 20                 [default: 15]
  mp.trap_complex = False     [default: False]

cf为默认

Mpmath settings:
  mp.prec = 53                [default: 53]
  mp.dps = 15                 [default: 15]
  mp.trap_complex = False     [default: False]