在各种Unices上相当于fesetflushtozero()

时间:2013-11-09 09:58:39

标签: solaris aix glibc hp-ux floating-point

HP-UX的libc具有函数fesetflushtozero,用于在“逐渐下溢”和“刷新到零”之间切换浮点行为。

尽管通过几个Unix libc(包括glibc)的文档和手册页进行梳理,我还没有找到如何在其他Unices中实现相同的功能。我对Linux / glibc,Solaris和AIX特别感兴趣。

2 个答案:

答案 0 :(得分:4)

正如您无疑指出的那样,没有标准的方法可以做到这一点(就此而言,没有标准的“刷新到零”定义,也没有硬件实现它的要求)。所以这样做的所有方法都是特定于平台的。要在列表中添加更多内容,因为这是一个有用的参考:

  • OSX / Intel:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)。请注意,此{em>仅效果算法在floatdouble中完成,这是使用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。

特定于平台,您有:

除了上面的fesetround()之外,找不到AIX的任何内容。