【问题标题】:Emulating fixed precision in python在 python 中模拟固定精度
【发布时间】:2017-01-10 09:25:59
【问题描述】:

对于数值分析的大学课程,我们正在从 Maple 过渡到 Numpy 和 Sympy 的组合,以获取课程材料的各种插图。这是因为学生们在前一个学期已经学习了 Python。

我们遇到的困难之一是在 Python 中模拟固定精度。 Maple 允许用户指定小数精度(例如 10 或 20 位),然后每次计算都使用该精度进行,因此您可以看到舍入误差的影响。在 Python 中,我们尝试了一些方法来实现这一点:

  • Sympy 具有对指定位数的舍入功能。
  • Mpmath 支持自定义精度。

然而,这不是我们想要的。这些选项计算精确结果并将精确结果四舍五入到指定的位数。我们正在寻找一种解决方案,它可以以指定的精度进行每个中间计算。例如,可以显示除以两个非常小的数字时可能发生的舍入误差。

到目前为止,最好的解决方案似乎是 Numpy 中的自定义数据类型。使用 float16、float32 和 float64,我们至少能够指出可能出现的问题。这里的问题是我们总是需要使用一个元素的数组,并且我们仅限于这三种数据类型。

对于我们的目的,是否存在更灵活的方法?或者我们正在寻找的东西是否隐藏在 mpmath 文档的某个地方?当然,有一些解决方法可以将计算的每个元素都封装在一个舍入函数中,但这会使学生的代码变得模糊。

【问题讨论】:

  • 您可能想看看decimal module(要点#5)。使用numpys 数据类型也是个好主意!我不明白为什么必须将它们与数组一起使用。 numpy.float16() 为您创建所需数据类型的浮点数。
  • “这些选项计算精确结果并将精确结果四舍五入到指定的位数。我们正在寻找一种解决方案,以指定的精度进行每个中间计算。” 以这种方式让自己明显失去精确度的图书馆无疑会成为一种出色的教学设备。对于其他任何事情,它也毫无用处。
  • @PaulPanzer,另一种用法(这是我感兴趣的)是评估对基于 NumPy 的代码的影响,该代码最终需要在有限精度的环境中运行。我对那个环境有一些影响,所以如果我可以尝试各种值,我可以选择最佳值。
  • 我不知道。我仍然希望任何有价值的库都能返回相当接近机器精度的结果。从某种意义上说,这就是数值分析的艺术。

标签: numpy floating-point precision fixed-point numerical-analysis


【解决方案1】:

您可以使用decimal。有多种使用方式,例如localcontextgetcontext

文档中的getcontext 示例:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')

localcontext 用法示例:

>>> from decimal import Decimal, localcontext
>>> with localcontext() as ctx:
...     ctx.prec = 4
...     print Decimal(1) / Decimal(3)
... 
0.3333

为了减少打字,您可以缩写构造函数(文档中的示例):

>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')

【讨论】:

  • 此外,您可以创建一个十进制对象的 numpy 数组。例如:a = np.array([Decimal(1),Decimal(2)])。它不会很快,因为所有操作本质上都会退回到调用 python 代码,但它会使用定点算法,这对演示应该是有益的。我认为您还应该能够对这些数组使用 most numpy 函数。我刚刚测试了np.dot,它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多