在python中模拟固定精度

时间:2017-01-10 09:25:59

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

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

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

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

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

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

为了我们的目的,还有更灵活的东西吗?或者我们正在寻找隐藏在mpmath文档中某处的东西?当然,通过在舍入函数中包装计算的每个元素有一些解决方法,但这会使代码模糊到学生。

1 个答案:

答案 0 :(得分:8)

您可以使用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')