等价于各种 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)。请注意,这影响在 floatdouble 中完成的算术,这是使用 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?

python3中涉及数字的各种函数

c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放

单片机下载芯片max232,ch340,pl2303,hl340与下载接线

判断二叉树是否对称的代码