`nextafter` 和 `nexttoward`:为什么是这个特定的界面?
`nextafter` and `nexttoward`: why this particular interface?
nextafter
(和nexttoward
)functions这个奇特的界面背后究竟是什么原因?我们通过指定我们想要向移动的值来指定方向。
乍一看,这个想法背后似乎隐藏着一些不明显的东西。在我(天真的)看来,此类函数的首选是一对单参数函数 nextafter(a)
/nextbefore(a)
。下一个选择是双参数函数 nextafter(a, dir)
,其中明确指定方向 dir
(-1
和 +1
,一些标准枚举等)。
但是我们必须指定一个值,我们希望向移动。因此有很多问题
(一个模糊的)。可能有一些聪明的想法或惯用模式非常有价值,以至于影响了这些标准功能中的接口选择。有吗?
如果决定盲目地使用 -DBL_MAX
和 +DBL_MAX
作为 nextafter
的第二个参数分别指定负方向和正方向会怎样?这样做有什么陷阱吗?
(2的细化)。如果我确定 b
[略] 大于 a
,是否有任何理由更喜欢 nextafter(a, b)
而不是 nextafter(a, DBL_MAX)
?例如。 nextafter(a, b)
版本是否有更好的性能?
nextafter
一般是重操作吗?我知道它依赖于实现。但是,再次假设一个基于 IEEE 754 表示的实现,找到相邻的浮点值是否公平 "difficult"?
对于 IEEE-754 二进制浮点表示,如果 nextafter
的两个参数都是有限的并且两个参数不相等,则可以通过对表示加一或减一来计算结果重新解释为无符号整数的数字 [注 1]。 (轻微的)复杂性源于正确处理不满足这些先决条件的极端情况,但总的来说你会发现它非常快。
除了 NaN 之外,第二个参数唯一重要的是它是大于、小于还是等于第一个参数。
该界面基本上为极端情况的结果提供了额外的清晰度,但有时也很有用。特别是 nextafter(x, 0)
的用法,无论符号如何截断,通常都很方便。您还可以利用 nextafter(x, x);
是 x
的事实将结果限制在任意值。
nextafter
和nexttowards
的区别在于后者允许你使用long double
更大的动态范围;同样,这有助于解决某些特殊情况。
- 严格来说,如果第一个参数是某个符号的零,而另一个参数是一个有效的相反符号的非零数,那么该参数需要在递增之前翻转其符号位。但将其添加到列表中似乎过于法律术语,而且它仍然不是一个复杂的转换。
nextafter
(和nexttoward
)functions这个奇特的界面背后究竟是什么原因?我们通过指定我们想要向移动的值来指定方向。
乍一看,这个想法背后似乎隐藏着一些不明显的东西。在我(天真的)看来,此类函数的首选是一对单参数函数 nextafter(a)
/nextbefore(a)
。下一个选择是双参数函数 nextafter(a, dir)
,其中明确指定方向 dir
(-1
和 +1
,一些标准枚举等)。
但是我们必须指定一个值,我们希望向移动。因此有很多问题
(一个模糊的)。可能有一些聪明的想法或惯用模式非常有价值,以至于影响了这些标准功能中的接口选择。有吗?
如果决定盲目地使用
-DBL_MAX
和+DBL_MAX
作为nextafter
的第二个参数分别指定负方向和正方向会怎样?这样做有什么陷阱吗?(2的细化)。如果我确定
b
[略] 大于a
,是否有任何理由更喜欢nextafter(a, b)
而不是nextafter(a, DBL_MAX)
?例如。nextafter(a, b)
版本是否有更好的性能?nextafter
一般是重操作吗?我知道它依赖于实现。但是,再次假设一个基于 IEEE 754 表示的实现,找到相邻的浮点值是否公平 "difficult"?
对于 IEEE-754 二进制浮点表示,如果 nextafter
的两个参数都是有限的并且两个参数不相等,则可以通过对表示加一或减一来计算结果重新解释为无符号整数的数字 [注 1]。 (轻微的)复杂性源于正确处理不满足这些先决条件的极端情况,但总的来说你会发现它非常快。
除了 NaN 之外,第二个参数唯一重要的是它是大于、小于还是等于第一个参数。
该界面基本上为极端情况的结果提供了额外的清晰度,但有时也很有用。特别是 nextafter(x, 0)
的用法,无论符号如何截断,通常都很方便。您还可以利用 nextafter(x, x);
是 x
的事实将结果限制在任意值。
nextafter
和nexttowards
的区别在于后者允许你使用long double
更大的动态范围;同样,这有助于解决某些特殊情况。
- 严格来说,如果第一个参数是某个符号的零,而另一个参数是一个有效的相反符号的非零数,那么该参数需要在递增之前翻转其符号位。但将其添加到列表中似乎过于法律术语,而且它仍然不是一个复杂的转换。