nextafter (和 nexttoward ) functions 的这个特殊接口(interface)背后的原因究竟是什么?我们通过指定我们想要移动的值来指定方向。

乍一看,这个想法背后似乎隐藏着一些不明显的东西。在我(天真)看来,此类函数的首选将类似于一对单参数函数 nextafter(a)/nextbefore(a) 。下一个选择将是一个双参数函数 nextafter(a, dir),其中明确指定方向 dir ( -1+1 ,一些标准枚举等)。

但相反,我们必须指定一个我们想要移动的值。因此有许多问题

  • (一个模糊的)。可能有一些聪明的想法或惯用的模式非常有值(value),以至于影响了这些标准功能中的接口(interface)选择。有没有?
  • 如果决定盲目地使用 -DBL_MAX+DBL_MAX 作为 nextafter 的第二个参数来分别指定负方向和正方向会怎样。这样做有什么陷阱吗?
  • (2 的改进)。如果我确定 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 将结果限制在任意值这一事实。
    nextafternexttowards 的区别在于后者允许你使用 long double 更大的动态范围;再次,这有助于某些极端情况。

  • 严格来说,如果第一个参数是某个符号的零,而另一个参数是相反符号的有效非零数,则该参数需要在增量之前翻转其符号位。但是将其添加到列表中似乎有太多的法律术语,而且它仍然不是一个复杂的转换。
  • 关于c - `nextafter` 和 `nexttoward` : why this particular interface?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52063370/

    10-09 05:44