nextafter
(和 nexttoward
) functions 的这个特殊接口(interface)背后的原因究竟是什么?我们通过指定我们想要移动的值来指定方向。
乍一看,这个想法背后似乎隐藏着一些不明显的东西。在我(天真)看来,此类函数的首选将类似于一对单参数函数 nextafter(a)
/nextbefore(a)
。下一个选择将是一个双参数函数 nextafter(a, dir)
,其中明确指定方向 dir
( -1
和 +1
,一些标准枚举等)。
但相反,我们必须指定一个我们想要移动的值。因此有许多问题
-DBL_MAX
和 +DBL_MAX
作为 nextafter
的第二个参数来分别指定负方向和正方向会怎样。这样做有什么陷阱吗? b
[略] 大于 a
,是否有任何理由更喜欢 nextafter(a, b)
而不是 nextafter(a, DBL_MAX)
?例如。 nextafter(a, b)
版本是否有更好的性能? nextafter
一般是一个繁重的操作吗?我知道它是依赖于实现的。但是,再次假设一个基于 IEEE 754 表示的实现,找到相邻的浮点值是否相当“困难”? 最佳答案
使用 IEEE-754 二进制浮点表示,如果 nextafter
的两个参数都是有限的并且两个参数不相等,则可以通过将重新解释为无符号整数的数字的表示加一或减一来计算结果[注 1]。 (轻微的)复杂性源于正确处理不满足这些先决条件的极端情况,但总的来说,您会发现它非常快。
除了 NaN 之外,第二个参数唯一重要的是它是大于、小于还是等于第一个参数。
该界面基本上为角落案例结果提供了额外的清晰度,但有时也很有用。特别是使用 nextafter(x, 0)
,无论符号如何都会截断,通常很方便。您还可以利用 nextafter(x, x);
是 x
将结果限制在任意值这一事实。nextafter
和 nexttowards
的区别在于后者允许你使用 long double
更大的动态范围;再次,这有助于某些极端情况。
关于c - `nextafter` 和 `nexttoward` : why this particular interface?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52063370/