HP-UX 的 libc 具有fesetflushtozero在“逐渐下溢”和“清零”之间切换浮点行为的功能。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,但我还没有找到如何在其他 Unices 中实现相同的目标。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
HP-UX 的 libc 具有fesetflushtozero在“逐渐下溢”和“清零”之间切换浮点行为的功能。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,但我还没有找到如何在其他 Unices 中实现相同的目标。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
正如您无疑已经指出的那样,没有标准的方法可以做到这一点(就此而言,没有“清零”的标准定义,也没有硬件实现它的任何要求)。因此,执行此操作的所有方法都是特定于平台的。要在列表中添加更多内容,因为这是一个有用的参考:
OSX/英特尔:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV). 请注意,这只影响在floator中完成的算术运算double,这是使用 SSE2 完成的(因此得名);long double使用不支持刷新的遗留 x87 指令执行算术运算。
iOS / arm:在 iOS 下的 32 位 ARM 上,flush-to-zero 是默认模式。您可以通过清除对象中的__fpscr_flush_to_zero位并使用.fenv_tfesetenv( )
iOS / arm64 fesetenv(_FE_DFL_DISABLE_DENORMS_ENV):。
我想知道为什么C99/UNIX 标准功能fesetround(FE_TOWARDZERO)不适合您——在所有这些平台上都是一样的,包括 HP/UX。
特定于平台,您有:
fesetflushtozero():nonstandard_arithmetic()切换到零舍入的功能:http: 除了上述之外,找不到任何适用于 AIX的内容fesetround()。