2013-11-09 34 views
2

HP-UX的libc中具有的功能fesetflushtozero切换“渐进下溢”和“零刷新”之间的浮点性能。等效fesetflushtozero()的

尽管通过几种Unix的libc中的(包括glibc的),我还没有找到如何实现同样的事情在其它UNIX系统中的文件和手册页梳理。我特别感兴趣的是Linux/glibc,Solaris和AIX。

回答

4

正如你所指出的,无疑,有做这个没有标准的方式(对于这个问题,还有的“排挤至零”没有标准的定义,也不是硬件实现它的任何要求)。因此,所有这些做法都是针对平台的。要添加更多一些到列表中,因为这是一个有用的参考:

  • OSX /英特尔:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)。请注意,这是只有影响算术在floatdouble完成,这是使用SSE2(因此名称)完成; long double使用旧版x87指令执行算术,该指令不支持刷新。

  • 式IO /臂:在iOS下32位ARM,冲洗到零是默认模式。您可以通过清除在fenv_t对象__fpscr_flush_to_zero位和安装该环境fesetenv()把它关闭对VFP指令(但不包括NEON)。

  • 的iOS/arm64:fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)

1

我想知道为什么C99/UNIX标准函数fesetround(FE_TOWARDZERO)不适合你 - 这在所有这些平台上都是一样的,包括HP/UX。

平台特有的,你必须:

找不到除fesetround()之外的任何AIX s以上。

+4

round-toward-zero和flush-to-zero具有完全不同的语义。 –

+0

感谢Solaris函数,它可以满足我的需求...但我认为您的答案的其余部分会将舍入模式和清零归零 –