0

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

import mpmath as mp

mp.prec = 20

mp.nprint(mp.sqrt(2), 20)

结果: 1.4142135623730951455

预期:(1.4142135623730950488根据此参考

4

2 回答 2

0

有趣的案例。使用 pythonsDecimal它给出的结果与您列出的参考相同,但使用floatormath.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内部使用。

但我认为这是正常的,而不是错误,因为floats 并不意味着 100% 精确;它们应该在机器上运行得很快。

于 2019-04-27T12:37:55.920 回答
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]
于 2020-01-26T17:29:49.503 回答