Numpy 在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支持自定义精度 然而,这不是我们想要的。这些选项计算精确结果,并将精确结果四舍

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

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

  • Sympy具有舍入指定位数的功能
  • Mpmath支持自定义精度
然而,这不是我们想要的。这些选项计算精确结果,并将精确结果四舍五入到指定的位数。我们正在寻找一种以指定精度进行所有中间计算的解决方案。例如,可以显示两个非常小的数字相除时可能发生的舍入错误的东西

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

对于我们的目的,是否存在更灵活的方法?或者我们正在寻找的东西就隐藏在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
,它可以工作。