Python 中浮点规范与十进制(定点)规范

bob*_*obo 5 python precision scientific-computing numerical-methods

对于精度很重要的用例,是否建议使用 Python 的本机浮点实现或其十进制实现?

我认为这个问题很容易回答:如果累积误差具有重大影响,例如可能在计算轨道轨迹等方面,那么精确的表示可能更有意义。

我不确定一般的深度学习用例、一般科学计算(例如,很多人使用 numpy 或 scikit-learn,我认为它们使用浮点实现)以及金融计算(例如交易策略)的规范是什么是。

有谁知道Python中这三个领域的浮点与小数使用规范?

  1. 金融(交易策略)
  2. 深度学习
  3. 科学计算

谢谢

注意:这/不是/关于浮点和定点表示之间的差异的问题,或者为什么浮点运算会产生令人惊讶的结果。这是一个关于什么是规范的问题。

whi*_*run 5

我对深度学习和科学计算了解得更多,但由于我的家人经营金融业务,我想我可以回答这个问题。

首先也是最重要的一点,浮点数并不是邪恶的。您所需要做的就是了解您的项目需要多少精度。

金融

在融资区域中,根据使用情况,您可以使用小数或浮点数。另外,不同的银行有不同的要求。一般来说,如果您处理的是现金或现金等价物,您可以使用小数,因为小数货币单位是已知的。例如,对于美元,小数货币单位为 0.01。所以你可以用来decimal存储它,在数据库中,你可以使用 number(20,2)(oracle) 或类似的东西来存储你的十进制数。精确度已经足够了,因为银行在第一天就有系统的方法来最大限度地减少错误,甚至在计算机出现之前。程序员只需要正确执行银行的指导方针即可。

对于融资领域的其他事情,比如分析和利率,使用double就足够了。在这里,精度并不重要,但简单性很重要。CPU 针对浮点数计算进行了优化,因此不需要特殊的方法来计算浮点运算。由于计算机中的算术是一个很大的话题,因此使用优化且稳定的方式来执行计算比创建自己的算术方法要安全得多。另外,一两次浮点计算不会对精度产生巨大的影响。例如,银行通常将值存储在 中decimal,然后与利率相乘float,然后转换回decimal。这样,错误就不会累积。考虑到我们只需要小数点右边两位,浮点数的精度足以完成这样的计算。

我听说在投资银行中,他们double在所有系统中都使用这种方法,因为他们处理大量现金。因此,在这些银行中,简单性和性能比精度更重要。

深度学习

深度学习是不需要高精度但确实需要高性能的领域之一。神经网络可以有数百万个参数,因此单个权重和偏差的精度不会影响网络的预测。相反,神经网络需要非常快速地计算才能在给定的数据集上进行训练,并在合理的时间间隔内给出预测。另外,许多加速器实际上可以加速特定类型的浮点数:半精度,即 fp16。因此,为了减少内存中网络的大小并加速训练和预测过程,许多神经网络通常以混合模式运行。神经网络框架和加速器驱动程序可以决定在 fp16 中计算哪些参数,同时具有最小的上溢和下溢风险,因为 fp16 的范围非常小:10^-8 到 65504。其他参数仍然在 fp32 中计算。在某些边缘使用中,可用内存非常小(例如,K 210和边缘TPU只有8MB板载SRAM),因此神经网络需要使用8位定点数来适应这些设备。定点数就像小数一样,与浮​​点数相反,因为它们的小数点后有固定的数字。通常,它们在系统中将自己表示为 int8 或 unit8。

科学计算

double类型(即64位浮点数)通常可以满足科学家进行科学计算的需要。此外,IEEE 754还定义了四精度(128位)以方便科学计算。Intel 的 x86 处理器还具有 80 位扩展精度格式。

然而,一些科学计算需要任意精度的算术。例如,计算圆周率和进行天文模拟需要高精度计算。因此,他们需要一些不同的东西,称为任意精度浮点数。支持任意精度浮点数的最著名的库之一是GNU 多精度算术库(GMP)。它们通常直接将数字存储在内存中,并使用堆栈来模拟垂直方法来计算最终结果。

一般来说,标准浮点数的设计相当好且优雅。只要您了解自己的需求,浮点数就可以满足大多数用途。

  • 人们可以更强调的是,在金融交易中,重要的是合同的所有各方,无论是现在还是将来,都能够使用记录的程序获得相同的结果。如果是这种情况,程序内部的内容并不重要,但程序的表述可能会以某种方式更简单。 (2认同)