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

Norms in Python for floating point vs. Decimal (fixed-point)

是否建议使用 Python 的本机浮点实现,或者它的 decimal 实现用于精度很重要的用例?

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

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

有谁知道这三个领域在python中浮点数与十进制使用的规范?

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

谢谢

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

我了解更多关于深度学习和科学计算的知识,但由于我的家人运行从事金融业务,我想我可以回答这个问题。

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

金融

在Financing 区域,根据用途,您可以使用小数或浮点数。另外,不同的银行有不同的要求。通常,如果您处理现金或现金等价物,您可以使用小数,因为小数货币单位是已知的。例如,美元的小数货币单位是 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 Multiple Precision Arithmetic Library(GMP) 是最著名的支持任意精度浮点数的库之一。他们一般直接跨内存存数,用栈模拟垂直法计算最终结果。

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