Ann*_*inn 15 c++ floating-point
假设我有两个浮点数,我想比较它们.如果一个大于另一个,程序应该采用一个分叉.如果情况恰恰相反,那么应采取另一条道路.并且它应该做同样的事情,如果被比较的值被轻微地推向一个方向,仍然应该比较真实.
这是一个难以解释的问题,所以我写这篇文章来证明它 -
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
}
Run Code Online (Sandbox Code Playgroud)
鉴于此代码,launchTheMissiles()保证永远不会被调用?
lio*_*ori 11
如果你可以保证a并且b不是NaN或无穷大,那么你可以这样做:
if (a<b) {
…
} else {
…
}
Run Code Online (Sandbox Code Playgroud)
除了无穷大和NaN之外的所有浮点值的集合包括总排序(带有两个零表示的故障,但这对你来说无关紧要),这与使用普通整数集合没有什么不同 - 唯一的区别是后续值之间的间隔大小不是恒定的,就像整数一样.
实际上,IEEE 754的设计使得可以使用与正常整数相同的操作来完成相同符号的非NaN非无穷大值的比较(同样,假设为零).因此,在这种特定情况下,您可以将这些数字视为"更好的整数".