2つの浮動小数点数があり、それらを比較したいとします。一方が他方よりも大きい場合、プログラムは1つのフォークを取る必要があります。反対のことが当てはまる場合は、別のパスを取る必要があります。そして、比較されている値が、それでも真と比較されるはずの方向にごくわずかに微調整されている場合は、同じことを行う必要があります。
言い表すのは難しい質問なので、それを実証するためにこれを書きました-
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()
決して呼び出されないことが保証されていますか?