【发布时间】:2015-03-04 08:09:50
【问题描述】:
是否保证浮点数:
-
(a <= b)暗示!(b > a) -
!(a <= b)暗示b > a
我目前正在处理跨语言,但如有必要,您可以在 C、C++ 或 C# 之一中假设 float 或 double。假设不涉及NaN。
我假设 IEEE 的规则在这里适用。我不确定他们的订购规则是否暗示上述内容。
我特别担心的是a 和b 并不总是相同的变量,而是相同的值。它们总是来自完全相同的计算。但是,由于比较是在不同的代码位置完成的,我无法保证它们是否始终是存储/截断形式(最终可能具有扩展精度)。
当我在寻找保证时,答案应该包括做出这些保证的参考资料,或者官方/强烈暗示这些保证。
【问题讨论】:
-
假设无穷大和 +-0 怎么样?
-
@JamesSnook,没有。这些值可以是 +-Infinity 或 +-0。虽然你可以忽略 +/-0,如果它更容易的话。这些值每次都以相同的方式生成,因此它们不会在 +-0 之间波动。
-
适用 IEEE 754 规则的假设是危险的。某些语言,包括 C、C++ 和 C#,允许编译器任意使用更高的精度进行某些计算。如果两个结果都向下舍入到 64 位,则两个计算的结果可能相等,但如果以 80 位扩展格式进行比较,则不相等。
-
这里的各种标准都有保证,但是编译器经常违反这些保证。我会向您推荐gcc bug 323,但您似乎已经知道这一点超过 10 年了。
-
@PatriciaShanahan 如果定义了
__STDC_IEC_559__,编译器承诺 IEEE-754 浮点运算有效。然而,这并不意味着它没有错误。此外,您刚才所说的并不完全正确;编译器可以以任意精度进行数学运算,但根据 as-if 规则,任何多余的精度都必须四舍五入。有时不这样做,或者只在需要寄存器溢出时才这样做,这是在论文The pitfalls of verifying floating-point computations 中探讨的一个错误。