在python中模拟固定精度

JKa*_*rts 16 floating-point precision numpy fixed-point numerical-analysis

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

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

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

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

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

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

Dmi*_*try 8

你可以用decimal.有几种使用方法,例如,localcontextgetcontext.

getcontext来自文档的示例:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
Run Code Online (Sandbox Code Playgroud)

localcontext用法示例:

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

要减少键入,您可以缩写构造函数(示例来自文档):

>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')
Run Code Online (Sandbox Code Playgroud)

  • 此外,您可以创建一个numpy十进制对象数组.例如:`a = np.array([Decimal(1),Decimal(2)])`.它不会*非常快,因为所有操作都将基本上回退到调用python代码,但它将使用定点算法,这应该适用于演示.我认为你也应该能够使用*most*numpy函数与这些数组.我刚刚测试了`np.dot`. (2认同)