Numpy 在python中模拟固定精度
对于数值分析的大学课程,我们正在从Maple过渡到Numpy和Sympy的组合,以获得课程材料的各种插图。这是因为学生们在前一学期已经学习了Python 我们遇到的困难之一是在Python中模拟固定精度。Maple允许用户指定十进制精度(比如10或20位),从那时起,每次计算都使用该精度,因此您可以看到舍入误差的影响。在Python中,我们尝试了一些方法来实现这一点:Numpy 在python中模拟固定精度,numpy,floating-point,precision,fixed-point,numerical-analysis,Numpy,Floating Point,Precision,Fixed Point,Numerical Analysis,对于数值分析的大学课程,我们正在从Maple过渡到Numpy和Sympy的组合,以获得课程材料的各种插图。这是因为学生们在前一学期已经学习了Python 我们遇到的困难之一是在Python中模拟固定精度。Maple允许用户指定十进制精度(比如10或20位),从那时起,每次计算都使用该精度,因此您可以看到舍入误差的影响。在Python中,我们尝试了一些方法来实现这一点: Sympy具有舍入指定位数的功能 Mpmath支持自定义精度 然而,这不是我们想要的。这些选项计算精确结果,并将精确结果四舍
- Sympy具有舍入指定位数的功能
- Mpmath支持自定义精度
localcontext
或getcontext
文档中的getcontext
示例:
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')
localcontext
用法示例:
>>> from decimal import Decimal, localcontext
>>> with localcontext() as ctx:
... ctx.prec = 4
... print Decimal(1) / Decimal(3)
...
0.3333
为了减少键入,可以缩写构造函数(文档中的示例):
你可能想看看(要点5)。另外,使用
numpy
s数据类型也是一个好主意!我不明白为什么必须将它们与数组一起使用numpy.float16()
创建所需数据类型的浮点。“这些选项计算精确结果,并将精确结果四舍五入到指定的位数。我们正在寻找一种以指定精度执行每个中间计算的解决方案。”毫无疑问,一个让自己以这种方式明显失去精确度的图书馆作为一个教学设备将是了不起的。它对其他任何东西都是毫无用处的。@PaulPanzer,另一个用法(我感兴趣的是)是评估对基于NumPy的代码的影响,最终需要在有限精度的环境中运行。我对那个环境有一些影响,所以如果我能用不同的值进行实验,我可以选择最佳值。我不知道。我仍然希望任何值得使用的库都能返回相当接近机器精度的结果。从某种意义上说,这是数字分析的艺术。此外,您可以创建十进制对象的numpy数组。例如:a=np.array([Decimal(1),Decimal(2)])
。它不会很快,因为所有操作基本上都会返回到调用python代码上来,但它将使用定点算法,这对于演示应该是很好的。我认为您还应该能够使用这些数组的大多数numpy函数。我刚刚测试了np.dot
,它可以工作。