c - 为什么 MSVS 不优化 +0?

标签 c floating-point compiler-optimization ieee-754 negative-zero

<分区>

question展示了一个非常有趣的现象:denormalized float 会使代码减慢一个数量级以上。

该行为在 accepted answer 中得到了很好的解释。 .然而,有一条评论,目前有 153 票,我找不到满意的答案:

Why isn't the compiler just dropping the +/- 0 in this case?!? – Michael Dorgan

旁注:我的印象是 0f 是/必须是完全可表示的(此外 - 它的二进制表示必须全为零),但在 c11 标准中找不到这样的声明。欢迎提供证明这一点的引文或反驳这一说法的论据。无论如何,Michael 的问题是这里的主要问题。


§5.2.4.2.2

An implementation may give zero and values that are not floating-point numbers (such as infinities and NaNs) a sign or may leave them unsigned.

最佳答案

编译器无法消除浮点正零的加法,因为它不是恒等运算。按IEEE 754 规则,结果加+0。到-0。不是-0。;它是 +0。

编译器可能会消除 +0 的减法。或添加-0。因为这些是身份操作。

例如,当我编译这个时:

double foo(double x) { return x + 0.; }

Apple GNU C 4.2.1 在 Intel Mac 上使用 -O3,生成的汇编代码包含 addsd LC0(%rip), %xmm0。当我编译这个时:

double foo(double x) { return x - 0.; }

没有添加指令;程序集仅返回其输入。

因此,原始问题中的代码很可能包含此语句的添加指令:

y[i] = y[i] + 0;

但未包含此语句的说明:

y[i] = y[i] - 0;

但是,第一条语句涉及 y[i] 中次正规值的算术运算,因此足以减慢程序速度。

关于c - 为什么 MSVS 不优化 +0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477037/

相关文章:

c - Gcc 编译器优化函数内联

c - MISRA 2012 违规 - 类型不匹配(规则 10.1、10.4)

c - 如何标记文件数据并将其存储在 C 中的数组中?

c - GTK+ 显示网站图标图像

c++ - 在 C++ 中 float 比 IEEE 754 更小的范围

c++ - 当我将代码提交给在线法官时,LDBL_MAX 和 LDBL_MIN 返回错误答案

c - 第二次运行getchar()到哪里去了

c++ - 为什么字符串到 float 的转换可能不起作用?

r - 为什么这个循环没有被取消切换?

c# -/optimize 标志启用了哪些运行时优化?