“ nextafter”和“ nexttoward”:为什么使用此特定界面?

时间:2018-08-28 17:24:26

标签: c floating-point standard-library

nextafter(和nexttowardfunctions的独特界面背后的原因到底是什么?我们通过指定要向移向的值来指定方向

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

但是相反,我们必须指定一个 value ,我们想将移向。因此有很多问题

  1. (模糊的一个)。可能有一些聪明的主意或惯用模式很有价值,以至于影响了这些标准功能中接口的选择。有吗?

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

  3. (对2的细化)。如果我确定ba大一点,是否有理由比nextafter(a, b)更喜欢nextafter(a, DBL_MAX)?例如。 nextafter(a, b)版本是否有可能获得更好的性能?

  4. nextafter通常是繁重操作吗?我知道这是依赖于实现的。但是,再次假设基于IEEE 754表示形式的实现,找到相邻的浮点值是否相当“困难”?

1 个答案:

答案 0 :(得分:4)

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

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

基本上,该接口可为极端情况提供更多的清晰度,但有时也很有用。尤其是,使用nextafter(x, 0)会被截断而与符号无关,这通常很方便。您还可以利用nextafter(x, x);x的事实来将结果限制在任意值。

nextafternexttowards之间的区别在于,后者允许您使用更大的long double动态范围;再次,这对某些极端情况很有帮助。


  1. 严格来说,如果第一个参数是某个符号的零,而另一个参数是相反符号的有效非零数字,则该参数需要在递增之前翻转其符号位。但是,将其添加到列表中似乎太多了法律法规,这仍然不是一个复杂的转换。