nextafter
(和nexttoward
)functions的独特界面背后的原因到底是什么?我们通过指定要向移向的值来指定方向。
乍一看,似乎这个想法背后隐藏着一些不明显的东西。在我(幼稚的)观点中,此类函数的首选将是一对单参数函数nextafter(a)
/ nextbefore(a)
。下一个选择是两参数函数nextafter(a, dir)
,其中显式指定方向dir
(-1
和+1
,一些标准枚举等)。
但是相反,我们必须指定一个 value ,我们想将移向。因此有很多问题
(模糊的一个)。可能有一些聪明的主意或惯用模式很有价值,以至于影响了这些标准功能中接口的选择。有吗?
如果决定只是盲目地使用-DBL_MAX
和+DBL_MAX
作为nextafter
的第二个参数来分别指定负向和正向,该怎么办。这样做有什么陷阱吗?
(对2的细化)。如果我确定b
比a
大一点,是否有理由比nextafter(a, b)
更喜欢nextafter(a, DBL_MAX)
?例如。 nextafter(a, b)
版本是否有可能获得更好的性能?
nextafter
通常是繁重操作吗?我知道这是依赖于实现的。但是,再次假设基于IEEE 754表示形式的实现,找到相邻的浮点值是否相当“困难”?
答案 0 :(得分:4)
对于IEEE-754二进制浮点表示,如果nextafter
的两个自变量都是有限的,并且两个自变量不相等,则可以通过将结果加1或从中减去1来计算结果。数字重新解释为无符号整数[注1]。 (轻微)复杂性是由于正确处理了不满足那些先决条件的极端情况而导致的,但总的来说,您会发现它非常快。
除了NaN外,第二个参数唯一重要的是它是否大于,小于或等于第一个参数。
基本上,该接口可为极端情况提供更多的清晰度,但有时也很有用。尤其是,使用nextafter(x, 0)
会被截断而与符号无关,这通常很方便。您还可以利用nextafter(x, x);
是x
的事实来将结果限制在任意值。
nextafter
和nexttowards
之间的区别在于,后者允许您使用更大的long double
动态范围;再次,这对某些极端情况很有帮助。