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