`nextafter` 和 `nexttoward`:为什么要使用这个特定的接口?

2024-03-02

这种奇特的界面背后的原因到底是什么?nextafter (and nexttoward) 功能 https://en.cppreference.com/w/c/numeric/math/nextafter?我们指定方向通过指定我们想要移动的值toward.

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

但我们必须指定一个value我们想搬家toward。因此产生了一些问题

  1. (一个模糊的)。可能有一些聪明的想法或惯用的模式非常有价值,以至于影响了这些标准函数中接口的选择。有没有?

  2. 如果决定盲目使用怎么办-DBL_MAX and +DBL_MAX作为第二个参数nextafter分别指定负方向和正方向。这样做有什么陷阱吗?

  3. (2 的细化)。如果我确定b[稍微]大于a,有什么理由选择nextafter(a, b) over nextafter(a, DBL_MAX)?例如。是否有机会获得更好的表现nextafter(a, b)版本?

  4. Is nextafter一般是一个heavy手术?我知道它取决于实施。但是,再次假设基于 IEEE 754 表示的实现,找到相邻浮点值是否相当“困难”?


对于 IEEE-754 二进制浮点表示,如果两个参数nextafter是有限的并且两个参数不相等,则可以通过在重新解释为无符号整数的数字表示中加一或减一来计算结果[注 1]。 (轻微的)复杂性是由于正确处理不满足这些先决条件的极端情况而产生的,但总的来说,您会发现它非常快。

除了 NaN 之外,第二个参数唯一重要的是它是否大于、小于或等于第一个参数。

该界面基本上为极端情况结果提供了额外的清晰度,但有时也很有用。特别是,使用nextafter(x, 0),无论符号如何都会截断,通常很方便。您还可以利用以下事实:nextafter(x, x); is x将结果限制在任意值。

和...之间的不同nextafter and nexttowards是后者允许您使用更大的动态范围long double;同样,这有助于解决某些极端情况。


  1. 严格来说,如果第一个参数是某个符号的零,而另一个参数是相反符号的有效非零数,则该参数需要在递增之前翻转其符号位。但将其添加到列表中似乎有太多法律术语,而且它仍然不是一个复杂的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`nextafter` 和 `nexttoward`:为什么要使用这个特定的接口? 的相关文章

随机推荐