假设我有两个浮点数,我想比较它们.如果一个大于另一个,程序应该采取一个叉.如果是相反的话,应该采取另一条路.它应该做同样的事情,如果正在比较的价值被微调,方向应该仍然使它比较真实.
这是一个困难的问题,所以我写这个来证明它 –
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 }
解决方法
如果可以保证a和b不是NaN或无限的,那么你可以做:
if (a<b) { … } else { … }
除了无穷大和NaN之外,所有浮点值的集合包括总排序(具有两个表示为零的毛刺,但对您而言无关紧要),这与使用正常的整数集不同 – 唯一的差异是后续值之间的间隔的大小不是恒定的,就像整数一样.
事实上,IEEE 754的设计使得可以用与正常整数相同的操作(再次,具有零的毛刺)来进行相同符号的非NaN非无穷大值的比较.所以,在这个具体情况下,你可以将这些数字看成是“更好的整数”.