【发布时间】:2013-11-21 12:36:28
【问题描述】:
HP-UX 的 libc 具有 fesetflushtozero 功能,可在“逐渐下溢”和“清零”之间切换浮点行为。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,但我还没有找到如何在其他 Unices 中实现相同的目标。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
【问题讨论】:
标签: solaris aix glibc hp-ux floating-point
HP-UX 的 libc 具有 fesetflushtozero 功能,可在“逐渐下溢”和“清零”之间切换浮点行为。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,但我还没有找到如何在其他 Unices 中实现相同的目标。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
【问题讨论】:
标签: solaris aix glibc hp-ux floating-point
我想知道为什么 C99/UNIX 标准 函数 fesetround(FE_TOWARDZERO) 不适合您 - 在所有这些平台上都是一样的,包括 HP/UX。
特定于平台,您有:
fesetflushtozero():nonstandard_arithmetic() 可以切换到零舍入:除了fesetround() 之外,找不到任何适用于 AIX 的内容。
【讨论】:
正如您无疑指出的那样,没有标准的方法可以做到这一点(就此而言,没有“清零”的标准定义,也没有硬件实现它的任何要求)。因此,执行此操作的所有方法都是特定于平台的。要在列表中添加更多内容,因为这是一个有用的参考:
OSX/英特尔:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)。请注意,这仅影响在 float 或 double 中完成的算术,这是使用 SSE2 完成的(因此得名); long double 算术是使用不支持刷新的旧版 x87 指令执行的。
iOS / arm:在 iOS 下的 32 位 ARM 上,清零是默认模式。您可以通过清除fenv_t 对象中的__fpscr_flush_to_zero 位并使用fesetenv( ) 安装该环境,将其关闭 用于VFP 指令(但不适用于NEON)。
iOS / arm64:fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)。
【讨论】: