浮点数,我可以信任多于/大于比较?

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非无穷大值的比较(同样,假设为零).因此,在这种特定情况下,您可以将这些数字视为"更好的整数".


Chr*_*s K 5

简短的回答,保证永远不会被调用。

如果a<b那么a将总是小于b加上一个正数,无论多么小。在这种情况下,测试 a 是否小于 b + 金额将为 true。

第三种情况就达不到了。