简单来说,浮点运算是指通过任何数量的自动化设备对浮点表示执行的算术运算。
传统上,这个定义的措辞仅适用于对实数的浮点表示(即,浮点数集合的有限元素)执行的算术运算,尽管几种额外的浮点数据类型,包括有符号无穷大和 NaN,也通常被允许作为此类函数的输入。
尽管定义简洁,但值得注意的是,最广泛采用的计算标准将几乎整个浮点理论都归为“浮点运算”之下。这种广度的原因之一源于这样一个事实:任何浮点表示都只能表示实数连续统 的有限子集;这种有限性带来了一系列意想不到的障碍,其中最主要的是实数算术的某些性质(例如,加法的结合律)有时对浮点数不成立(IEEE 计算机协会 2008)。因此,任何对浮点运算和/或代数的全面处理都必须在讨论实际操作本身之前,解决包括浮点数表示、舍入等在内的众多注意事项。
截至 2014 年,最常用的浮点运算标准是 IEEE 754-2008 浮点算术标准(简写为 IEEE 754-2008,此后简称为 IEEE 754)。该框架是对其前身 IEEE 754-1985 的大规模修订,包含一套内置的指南,几乎详细说明了浮点理论的方方面面。特别是,IEEE 754 详细讨论了浮点理论的以下方面:
1. 浮点表示和格式。
2. 浮点表示的属性,包括浮点数的舍入。
3. 浮点表示的算术和代数运算。
4. 无穷大、非数字 (NaNs)、符号和异常。
上述许多主题在标准文档的多个章节中进行了讨论(IEEE 计算机协会 2008)。
IEEE 754 对浮点表示定义的“必需”算术运算是加法、减法、乘法、除法、平方根和融合乘加(由 定义的三元运算);这些是必需的,因为遵守该框架要求这些运算在整个过程中都支持正确的舍入。该框架内还提供了许多其他“推荐”运算,其中一些本质上是算术运算;这些是推荐的,因为框架并未严格要求支持它们。最后,请注意,该框架既包含一组实用函数(也可以被认为是算术函数),即 copy、negate 和 abs,也包含许多为向量值输入定义的密切相关函数(IEEE 计算机协会 2008,第 46-47 页)
运算 | 函数 | 域 | 可能的异常 |
exp | 溢出;下溢 | ||
expm1 | 溢出;下溢 | ||
exp2 | 溢出;下溢 | ||
exp2m1 | 溢出;下溢 | ||
exp10 | 溢出;下溢 | ||
exp10m1 | 溢出;下溢 | ||
log | 除以零(如果 );无效操作(如果 ) | ||
log2 | 除以零(如果 );无效操作(如果 ) | ||
log10 | 除以零(如果 );无效操作(如果 ) | ||
logp1 | 除以零(如果 );无效操作(如果 );下溢 | ||
log2p1 | 除以零(如果 );无效操作(如果 );下溢 | ||
log10p1 | 除以零(如果 );无效操作(如果 );下溢 | ||
溢出;下溢 | |||
rSqrt | 无效操作(如果 );除以零(如果 ) | ||
无效操作(如果 ) | |||
无效操作(如果 或 且 为偶数);溢出/下溢(如果 ) | |||
多种情况 | |||
多种情况 | |||
多种情况 |
上表总结了 IEEE 754 中推荐的算术运算。请注意,标记为“多种情况”的异常的具体细节在 IEEE 754 文档中详细说明(IEEE 计算机协会 2008,第 43-45 页)。
如上所述,即使是一些基本的要求的算术运算符,在浮点表示和舍入的情况下,其行为也是不可预测的。这源于这样一个事实:IEEE 754 中假定“正常”算术运算具有无限精度,而浮点加法、减法、乘法和除法的值(分别符号地写为 , , , 和 )是通过对以公共指数表示的浮点数执行“正常”运算 , , , 和 ,然后将结果舍入到固定位数的有效数字(通过所谓的首选指数)。因此,在计算的算术和/或舍入步骤中都可能发生精度损失、溢出和下溢。例如, 和 相加的结果正好是
(1)
|
另一方面,在基数为 且精度为 7 位的框架中,浮点加法返回的值将是
(2)
|
类似地,给定 和 ,可以得到
(3)
|
使用上面假设的 7 位精度。但是,可以得到
(4)
|
因此导致完全没有精度。请注意,在像这样的极端情况下,实现 IEEE 754 的系统不会实际产生 作为结果:特别是,这种情况会触发下溢警告。关于上述其他算术函数的详细信息和注意事项可以在文档中找到(IEEE 计算机协会 2008,第 5 节和第 9 节)。
浮点运算在本质上是算术运算和代数/三角运算之间存在一些区别:后一种运算通常归为浮点代数的范畴。