浮点比较是否连续?如果!(a< = b)是(b> a)保证?

时间:2015-03-04 08:09:51

标签: floating-point ieee-754

是否保证浮点:

  • (a <= b)隐含!(b > a)
  • !(a <= b)隐含b > a

我目前正在处理跨语言,但如果需要,您可以在C,C ++或C#中假设floatdouble。假设不涉及NaN

我认为IEEE的规则适用于此。我不确定他们的订购规则是否意味着上述情况。

我特别关注的是ab并不总是相同的变量,而是相同的值。它们总是来自完全相同的计算。但是,由于比较是在不同的代码位置完成的,我不能保证它们是否总是存储/截断的形式(最终可能会有扩展的精度)。

由于我正在寻求保证,答案应包括提供这些保证的参考,或正式/强烈暗示担保。

2 个答案:

答案 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-必需的无序 - 安静谓词和否定

     

enter image description here

     

表5.2中的无序信令谓词,供...使用   程序编写,以考虑NaN的可能性   操作数,在安静的NaN操作数上发出无效操作异常信号:

     

表5.2-必需的无序信令谓词和否定

     

enter image description here

     

表5.3中的无序安静谓词,供...使用   编写的程序考虑到NaN操作数的可能性,   不要在安静的NaN操作数上发出异常信号:

     

表5.3-必需的无序 - 安静谓词和否定

     

enter image description here

     

有两种方法可以编写谓词的逻辑否定,一种   使用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