对于数学分析的大学课程,我们正在从Maple过渡到Numpy和Sympy的组合,以获得课程材料的各种插图。这是因为学生们之前已经学习过Python。
我们遇到的一个困难是在Python中模拟固定精度。 Maple允许用户指定小数精度(比如10或20位),然后在每次计算时都使用该精度,这样您就可以看到舍入误差的影响。在Python中,我们尝试了一些方法来实现这一目标:
然而,这不是我们想要的。这些选项计算确切结果并将精确结果四舍五入到指定的位数。我们正在寻找一种能够以指定精度进行每次中间计算的解决方案。例如,可以显示分割两个非常小的数字时可能发生的舍入误差的东西。
到目前为止,最好的解决方案似乎是Numpy中的自定义数据类型。使用float16,float32和float64,我们至少能够指出可能出现的问题。这里的问题是我们总是需要使用一个元素的数组,并且我们仅限于这三种数据类型。
为了我们的目的,还有更灵活的东西吗?或者我们正在寻找隐藏在mpmath文档中某处的东西?当然,通过在舍入函数中包装计算的每个元素有一些解决方法,但这会使代码模糊到学生。
答案 0 :(得分:8)
您可以使用decimal
。有几种使用方法,例如localcontext
或getcontext
。
来自文档的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')