Floating point 浮点比较是连续的吗?如果!(a<;=b)有(b>;a)担保吗?
是否保证浮点值满足以下条件:Floating point 浮点比较是连续的吗?如果!(a<;=b)有(b>;a)担保吗?,floating-point,ieee-754,Floating Point,Ieee 754,是否保证浮点值满足以下条件: (a) !(a 我现在正在处理跨语言,但是如果C语言,C,C++,或C中的一个,你可以假设浮点或双。假设没有楠< /C> >。 我假设IEEE的规则适用于这里。我不确定他们的排序规则是否暗示了上述内容 我特别关心的是a和b并不总是相同的变量,而是相同的值。它们总是由完全相同的计算结果得出。但是,由于比较是在不同的代码位置进行的,我无法保证它们是否总是存储/截断的表单(最终可能会达到更高的精度) 当我在寻找担保时,答案应包括做出这些担保的参考,或官方/强烈暗示担保
(a)
!(a
我现在正在处理跨语言,但是如果C语言,C,C++,或C中的一个,你可以假设<代码>浮点或<代码>双。假设没有<代码>楠< /C> >。 我假设IEEE的规则适用于这里。我不确定他们的排序规则是否暗示了上述内容
我特别关心的是a
和b
并不总是相同的变量,而是相同的值。它们总是由完全相同的计算结果得出。但是,由于比较是在不同的代码位置进行的,我无法保证它们是否总是存储/截断的表单(最终可能会达到更高的精度)
当我在寻找担保时,答案应包括做出这些担保的参考,或官方/强烈暗示担保。根据IEEE 754(2008)标准(§5.11):
可能存在四种互斥关系:小于、等于、大于和无序。最后一种情况发生在至少一个操作数为NaN时。每个NaN都应将无序与包括自身在内的所有对象进行比较。比较应忽略零的符号(so+0=−0)。相同符号的无限个操作数的比较应相等
是的,假设两个参数都不是NaN,那么这两个陈述都是正确的
至于隐式扩展精度格式的使用,问题是允许这些格式意味着它不再严格遵循IEEE 754标准。请参阅启用严格遵从性
更新:据我所知,如果您使用的是最新标准(例如
-std=c99
),那么您不必担心中间精度,只要您比较的是声明的变量(例如双a=0.1;if(a
)而不是常量(例如if(0.1
).答案是是,但这只是因为根据我对IEEE-754标准的理解,您排除了NAN。通常答案是否。该标准的相关部分如下所示:
5.11比较谓词的详细信息
对于每种支持的算术格式,应能够进行比较
以该格式将一个浮点基准转换为另一个浮点基准(见5.6.1)。
此外,浮点数据以不同的格式表示
只要操作数的格式相同,则应具有可比性
基数
四种相互排斥的关系是可能的:小于、等于、,
大于,且无序。当至少一个操作数为NaN时,会出现最后一种情况。每个NaN都应与无序进行比较
一切,包括它本身。比较应该忽略
零(so+0=−0)。应比较相同符号的无限个操作数
平等
语言定义了比较结果的传递方式,以
两种方式中的一种:作为一种关系标识四种方式中的一种
上面列出的关系,或作为对谓词的真假响应
它指定了所需的特定比较
表5.1、表5.2和表5.3展示了22项功能
不同的有用谓词和否定,具有不同的特殊和
传统名称和符号。如果每个谓词的任何一个
指示的关系为真。关系“”表示无序
表5.2列出了五个无序的信令谓词和
当
关系无序。该无效操作异常将进行保护
防止使用
标准谓词{}及其否定,不带
考虑一个安静的NaN操作数的可能性
显式地考虑到操作数可能会发生异常的可能性
使用表5.3中不发出信号的无序安静谓词
这样一个无效的操作异常
除了无效操作外,比较从不发出异常信号
例外
注意,谓词成对出现,每个谓词都是
其他;应用前缀,例如不否定表中的谓词
表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)的逻辑求反
UN
关系,因此剩下的是setEQ LT GT