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)
. 请注意,这只影响在float
or中完成的算术运算double
,这是使用 SSE2 完成的(因此得名);long double
使用不支持刷新的遗留 x87 指令执行算术运算。
iOS / arm:在 iOS 下的 32 位 ARM 上,flush-to-zero 是默认模式。您可以通过清除对象中的__fpscr_flush_to_zero
位并使用.fenv_t
fesetenv( )
iOS / arm64 fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)
:。
我想知道为什么C99/UNIX 标准功能fesetround(FE_TOWARDZERO)
不适合您——在所有这些平台上都是一样的,包括 HP/UX。
特定于平台,您有:
fesetflushtozero()
:nonstandard_arithmetic()
切换到零舍入的功能:http: 除了上述之外,找不到任何适用于 AIX的内容fesetround()
。