假设我有两个 float ,我想比较它们。如果一个大于另一个,程序应该采用一个 fork。如果情况正好相反,它应该走另一条路。并且它应该做同样的事情,如果被比较的值在一个仍然应该使它比较真实的方向上被轻轻插入。
这是一个很难表达的问题,所以我写了这个来演示它-
float a = random();
float b = random(); // always returns a number (no infinity or NaNs)
if(a < b){
if( !(a < b + FLOAT_EPISILON) ) launchTheMissiles();
buildHospitals();
}else if(a >= b){
if( !(a >= b - FLOAT_EPISILON) ) launchTheMissiles();
buildOrphanages();
}else{
launchTheMissiles(); // This should never be called, in any branch
}
鉴于此代码,是否保证永远不会调用 launchTheMissiles()
?
最佳答案
如果您可以保证 a
和 b
不是 NaN 或无穷大,那么您可以这样做:
if (a<b) {
…
} else {
…
}
除了无穷大和 NaN 之外的所有浮点值的集合构成了一个总排序(带有两个零表示的故障,但这对你来说并不重要),这与使用普通整数集没有什么不同——唯一的区别是后续值之间的间隔大小不是恒定的,就像整数一样。
事实上,IEEE 754 的设计使得相同符号的非 NaN 非无穷大值的比较可以通过与普通整数相同的操作来完成(同样,零故障)。因此,在这种特定情况下,您可以将这些数字视为“更好的整数”。
关于c++ - 浮点,我可以信任多少小于/大于比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374444/