是否保证浮点:
(a <= b)
隐含!(b > a)
!(a <= b)
隐含b > a
我目前正在处理跨语言,但如果需要,您可以在C,C ++或C#中假设float
或double
。假设不涉及NaN
。
我认为IEEE的规则适用于此。我不确定他们的订购规则是否意味着上述情况。
我特别关注的是a
和b
并不总是相同的变量,而是相同的值。它们总是来自完全相同的计算。但是,由于比较是在不同的代码位置完成的,我不能保证它们是否总是存储/截断的形式(最终可能会有扩展的精度)。
由于我正在寻求保证,答案应包括提供这些保证的参考,或正式/强烈暗示担保。
答案 0 :(得分:6)
根据IEEE 754(2008)标准(第5.11节):
可能存在四种互斥关系:小于,等于,大于,无序。当至少一个操作数是NaN时,出现最后一种情况。每个NaN都应将无序与包括其自身在内的所有内容进行比较。比较应忽略零的符号(所以+0 = -0)。相同符号的无限操作数应比较相等。
所以是的,假设两个参数都不是NaN,那么这两个语句都是正确的。
关于隐式扩展精度格式的使用,问题是允许这些意味着它不再严格遵循IEEE 754标准。有关启用严格合规性的信息,请参阅this excellent answer and discussion。
更新:据我了解,如果您使用的是最近的标准(例如-std=c99
),那么只要您要比较的内容是声明变量,您就不必担心中间精度(例如double a = 0.1; if (a < b) ...
)而不是常数(例如if (0.1 < b) ...
)。
答案 1 :(得分:3)
答案是是,但仅仅因为您通过阅读IEEE-754标准排除了NaN。通常答案是否。标准的相关部分如下:
5.11比较谓词的详细信息
对于每种支持的算术格式,都可以进行比较 一种浮点数据到另一种格式(见5.6.1)。 另外,浮点数据以不同格式表示 只要操作数的格式相同,就具有可比性 基数。
可能存在四种相互排斥的关系:小于,相等, 大于,无序。当至少一个操作数是NaN时,出现最后一种情况。每个NaN都应将无序与。进行比较 一切,包括自己。比较应忽略的标志 零(所以+0 = -0)。相同符号的无限操作数应进行比较 等于
语言定义如何传递比较结果 两种方式之一:作为识别四种方式之一的关系 上面列出的关系,或者作为对谓词的真假回应 命名所需的具体比较。
表5.1,表5.2和表5.3在功能上表现出二十二个 各种特殊的和不同的有用的谓词和否定 传统的名称和符号。每个谓词都是真的,如果有的话 表明关系是真的。关系“?”表示无序 关系。表5.2列出了五个无序信令谓词和 他们的否定导致无效的操作异常时 关系是无序的。无效的操作异常防御 在使用该程序编写的程序中出现意外的安静NaN 标准谓词{&lt;,&lt; =,&gt; =,&gt;}及其否定,没有 考虑一个安静的NaN操作数的可能性。程序 明确考虑到可能安静的NaN操作数的可能性 使用表5.3中没有信号的无序 - 静默谓词 这样一个无效的操作异常。
比较永远不会发出除无效操作之外的异常信号 异常。
请注意,谓词成对出现,每个谓词都是逻辑否定的 其他;应用NOT之类的前缀来否定表中的谓词 5.1,表5.2和表5.3颠倒了其相关条目的真/假意义,但不改变无序关系 导致无效的操作异常。
表5.1中的无序 - 静默谓词不表示异常 安静的NaN操作数:
表5.1-必需的无序 - 安静谓词和否定
表5.2中的无序信令谓词,供...使用 程序不编写,以考虑NaN的可能性 操作数,在安静的NaN操作数上发出无效操作异常信号:
表5.2-必需的无序信令谓词和否定
表5.3中的无序安静谓词,供...使用 编写的程序考虑到NaN操作数的可能性, 不要在安静的NaN操作数上发出异常信号:
表5.3-必需的无序 - 安静谓词和否定
有两种方法可以编写谓词的逻辑否定,一种 使用NOT显式,另一个反转关系运算符。 因此在编写的程序中没有考虑NaN的可能性 操作数,无序信号谓词的逻辑否定(X. &LT; Y)只是无序信令谓词NOT(X
= Y)的不同之处在于它 当X和Y为时,不表示无效的操作异常 无序(除非X或Y是信令NaN)。相反,(X = Y)的逻辑否定可以写为NOT(X = Y)或 (X?&lt; Y&gt;);在这种情况下,两个表达式在功能上是等价的 至(X≠Y)。
因此,对我来说,由于缺少NaN排除了UN
关系,因此剩下的就是集合EQ LT GT
。肯定LT EQ
表示拒绝GT
,拒绝LT EQ
确实是GT
。