等价于各种 Unices 上的 fesetflushtozero()
Posted
技术标签:
【中文标题】等价于各种 Unices 上的 fesetflushtozero()【英文标题】:Equivalent of fesetflushtozero() on various Unices 【发布时间】:2013-11-21 12:36:28 【问题描述】:HP-UX 的 libc 具有 fesetflushtozero
功能,可在“逐渐下溢”和“清零”之间切换浮点行为。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,但我还没有找到如何在其他 Unices 中实现相同的目标。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
【问题讨论】:
【参考方案1】:我想知道为什么 C99/UNIX 标准 函数 fesetround(FE_TOWARDZERO)
不适合您 - 在所有这些平台上都是一样的,包括 HP/UX。
特定于平台,您有:
Linux glibc 有便捷功能fesetflushtozero()
:http://www.gnu.org/software/libc/manual/html_node/Rounding.html
Solaris libm 有一个函数nonstandard_arithmetic()
可以切换到零舍入:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_lib.html#2219
除了fesetround()
之外,找不到任何适用于 AIX 的内容。
【讨论】:
向零舍入和归零具有完全不同的语义。 感谢 Solaris 函数,它可以满足我的需要……但我认为您的其余答案混淆了舍入模式和清零【参考方案2】:正如您无疑指出的那样,没有标准的方法可以做到这一点(就此而言,没有“清零”的标准定义,也没有硬件实现它的任何要求)。因此,执行此操作的所有方法都是特定于平台的。要在列表中添加更多内容,因为这是一个有用的参考:
OSX/英特尔:fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV)
。请注意,这仅影响在 float
或 double
中完成的算术,这是使用 SSE2 完成的(因此得名); long double
算术是使用不支持刷新的旧版 x87 指令执行的。
ios / arm:在 iOS 下的 32 位 ARM 上,清零是默认模式。您可以通过清除fenv_t
对象中的__fpscr_flush_to_zero
位并使用fesetenv( )
安装该环境,将其关闭 用于VFP 指令(但不适用于NEON)。
iOS / arm64:fesetenv(_FE_DFL_DISABLE_DENORMS_ENV)
。
【讨论】:
以上是关于等价于各种 Unices 上的 fesetflushtozero()的主要内容,如果未能解决你的问题,请参考以下文章
通过 Nginx 的 uwsgi + django - uwsgi 设置/生成?
什么是现代的、可移植的、安全的等价于 C 中编译时检查的 memcpy?
c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放