大多数语言都有用于获取下一个或上一个单精度(32 位)和/或双精度(64 位)数字的内在函数或库函数。
对于 32 位和 64 位浮点运算的用户,对基本结构的良好理解对于避免它们的一些危险非常有用。IEEE 标准统一适用,但仍将许多细节留给实施者。因此,基于机器字表示的位操作的平台通用解决方案可能存在问题,并且可能取决于诸如字节序等问题。虽然了解它如何或应该如何在位级别工作的所有血腥细节可能会展示智力,但最好使用为每个平台量身定制并具有跨受支持平台的通用 API 的内在或库解决方案。
我注意到 C# 和 C++ 的解决方案。这里有一些Java:
Math.nextUp:
公共静态双下一个(双d):
- 返回正无穷方向上与 d 相邻的浮点值。该方法在语义上等价于 nextAfter(d, Double.POSITIVE_INFINITY); 但是,nextUp 实现可能比其等效的 nextAfter 调用运行得更快。
特别案例:
- 如果参数为 NaN,则结果为 NaN。
- 如果参数是正无穷大,则结果是正无穷大。
- 如果参数为零,则结果为 Double.MIN_VALUE
参数:
回报:
公共静态浮动 nextUp(float f):
- 返回在正无穷大方向上与 f 相邻的浮点值。这个方法在语义上等价于 nextAfter(f, Float.POSITIVE_INFINITY); 但是,nextUp 实现可能比其等效的 nextAfter 调用运行得更快。
特别案例:
- 如果参数为 NaN,则结果为 NaN。
- 如果参数是正无穷大,则结果是正无穷大。
- 如果参数为零,则结果为 Float.MIN_VALUE
参数:
回报:
接下来的两个使用起来有点复杂。然而,朝向零或朝向正无穷或负无穷的方向似乎更有可能和有用的用途。另一个用途是查看两个值之间存在的中间值。可以使用循环和计数器确定两个值之间存在多少个。此外,似乎它们以及 nextUp 方法可能对 for 循环中的递增/递减有用。
Math.nextAfter:
public static double nextAfter(双开始,双向)
- 返回第二个参数方向上与第一个参数相邻的浮点数。如果两个参数比较相等,则返回第二个参数。
特别案例:
- 如果任一参数是 NaN,则返回 NaN。
- 如果两个参数都是带符号的零,则返回方向不变(如果参数比较相等,则返回第二个参数的要求暗示了这一点)。
- 如果 start 是 ±Double.MIN_VALUE 并且 direction 的值使得结果应该具有较小的幅度,则返回与 start 具有相同符号的零。
- 如果 start 是无限的,并且 direction 的值使得结果应该具有较小的幅度,则返回与 start 具有相同符号的 Double.MAX_VALUE。
- 如果 start 等于 ± Double.MAX_VALUE 并且 direction 的值使得结果应该具有更大的量级,则返回与 start 符号相同的无穷大。
参数:
- start - 起始浮点值
- direction - 指示应该返回 start 的哪个邻居或 start 的值
回报:
public static float nextAfter(浮动开始,双向)
- 返回第二个参数方向上与第一个参数相邻的浮点数。如果两个参数比较相等,则返回与第二个参数等效的值。
特别案例:
- 如果任一参数是 NaN,则返回 NaN。
- 如果两个参数都是带符号的零,则返回与方向等效的值。
- 如果 start 是 ±Float.MIN_VALUE 并且 direction 的值使得结果应该具有较小的幅度,则返回与 start 具有相同符号的零。
- 如果 start 是无限的,并且 direction 的值使得结果应该具有较小的幅度,则返回与 start 具有相同符号的 Float.MAX_VALUE。
- 如果 start 等于 ± Float.MAX_VALUE 并且 direction 的值使得结果应该具有更大的量级,则返回与 start 符号相同的无穷大。
参数:
- start - 起始浮点值
- direction - 指示应该返回 start 的哪个邻居或 start 的值
回报: