HP-UX的libc具有函数fesetflushtozero
,用于在“逐渐下溢”和“刷新到零”之间切换浮点行为。
尽管通过几个Unix libc(包括glibc)的文档和手册页进行梳理,我还没有找到如何在其他Unices中实现相同的功能。我对Linux / glibc,Solaris和AIX特别感兴趣。
答案 0 :(得分:4)
正如您无疑指出的那样,没有标准的方法可以做到这一点(就此而言,没有标准的“刷新到零”定义,也没有硬件实现它的要求)。所以这样做的所有方法都是特定于平台的。要在列表中添加更多内容,因为这是一个有用的参考:
OSX / Intel:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)
。请注意,此{em>仅效果算法在float
或double
中完成,这是使用SSE2(因此名称)完成的;使用遗留x87指令执行long double
算术运算,这些指令不支持刷新。
iOS / arm:在iOS下的32位ARM上,flush-to-zero是默认模式。您可以通过清除__fpscr_flush_to_zero
对象中的fenv_t
位并使用fesetenv( )
安装该环境来为VFP指令(但不适用于NEON)将其关闭。< / p>
iOS / arm64:fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)
。
答案 1 :(得分:0)
我想知道为什么 C99 / UNIX标准函数fesetround(FE_TOWARDZERO)
不适合你 - 在所有这些平台上都是一样的,包括HP / UX。
特定于平台,您有:
fesetflushtozero()
:nonstandard_arithmetic()
可以切换到零舍入:除了上面的fesetround()
之外,找不到AIX的任何内容。