【发布时间】:2013-05-04 19:54:57
【问题描述】:
这个question 展示了一个非常有趣的现象:denormalized 浮点数会使代码减慢一个数量级以上。
accepted answer 很好地解释了这种行为。但是,有一条评论,目前有 153 票,我无法找到满意的答案:
在这种情况下,为什么编译器不直接删除 +/- 0?!? – 迈克尔·多根
旁注:我的印象是 0f 是/必须是完全可表示的(此外 - 它的二进制表示必须全为零),但在 c11 标准中找不到这样的声明。证明这一点的引述或反驳这一主张的论点将是最受欢迎的。无论如何,Michael 的问题是这里的主要问题。
实现可能会给出零和非浮点值 数字(例如无穷大和 NaN)是一个符号或可能会留下它们 未签名。
【问题讨论】:
-
这在the answer 的最后一个 cmets 中回答了链接问题:“@s73v3r:+0.f 无法优化,因为浮点数为负 0,并且将 +0.f 添加到 -.0f 的结果是 +0.f。因此添加 0.f 不是恒等运算,无法优化。- Eric Postpischil"
-
并且要清楚 - 不是
+0.f或-0.f是非规范化的 - 它是数组中添加零的值是非规范化的(并导致减速)。 -
我认为编辑不会改变任何东西。 MSVC 使用的浮点实现使用有符号零。这可能不是 C 标准所要求的,但可能是 IEEE 754 所要求的(老实说,我不知道)。但是,
/fp:fast选项可能会导致编译器优化+0.f- 我不知道。 -
我不认为 C 或 C++ 标准规定了浮点零应该如何表示。但是,我的理解是 IEEE 754 指定零由所有零位表示(负零情况下的符号位除外)。但我与浮点专家相去甚远,对 IEEE 标准的细节几乎一无所知。所以,我在这条评论中所说的可能不是很有用。
-
现在有 153 票。
标签: c floating-point