【问题标题】:`nextafter` and `nexttoward`: why this particular interface?`nextafter` 和 `nexttoward`:为什么是这个特殊的界面?
【发布时间】:2019-02-03 09:53:15
【问题描述】:

nextafter(和nexttoward)functions这个奇特的界面究竟是什么原因?我们通过指定要移动向的值来指定方向。

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

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

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

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

  3. (2 的改进)。如果我确定b [略] 大于a,有什么理由更喜欢nextafter(a, b) 而不是nextafter(a, DBL_MAX)?例如。 nextafter(a, b) 版本是否有可能获得更好的性能?

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

【问题讨论】:

  • 我可以告诉您,IEEE 754-2008(由 ISO/IEC TS 18661 并入 C 语言)恰好添加了您建议的理想的单参数函数,名称为 nextup 和 @ 987654341@。我还可以告诉你,glibc implementation of nextafter 没有做任何聪明的事情,它只关心第二个参数是大于还是小于第一个参数,而不关心差异的大小。我不知道为什么 nextafter 一开始就是这样指定的。
  • 我也不知道这个手术有多贵。 glibc 实现使用整数指令对二进制表示进行位旋转,这通常是相当重量级的,因为您必须从浮点数复制到整数寄存器并返回,但这只是一个猜测。此外,除了将其作为原始操作添加到 CPU 的指令集之外,可能没有更好的方法来做到这一点。
  • nextafter( double from, double to ) 总是有明确的答案。 AnT_nextafter(a) 不在没有可编码无穷大的系统上。示例:AnT_nextafter(DBL_MAX)?还是个好问题。如果我看到nextafter(from, to) 的唯一优势,这个极端案例。

标签: c floating-point standard-library


【解决方案1】:

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

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

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

nextafter和nexttowards的区别在于后者允许你使用long double更大的动态范围;同样,这有助于解决某些极端情况。


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

【讨论】:

  • 要清楚脚注:如果你有-0.0,值表示是0x80000000 00000000。只需将 1 添加到表示将产生 0x80000000 00000001,即 -FLT_MIN,而正确的值是 0x00000000 00000001。因此,在这种特殊的极端情况下,您需要在添加符号位之前翻转符号位。如果这些词令人困惑,请告诉我,以便我可以尝试写得更好。
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多