c++ - 浮点,我可以信任多少小于/大于比较?

标签 c++ floating-point

假设我有两个 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()

最佳答案

如果您可以保证 ab 不是 NaN 或无穷大,那么您可以这样做:

if (a<b) {
    …
} else {
    …
}

除了无穷大和 NaN 之外的所有浮点值的集合构成了一个总排序(带有两个零表示的故障,但这对你来说并不重要),这与使用普通整数集没有什么不同——唯一的区别是后续值之间的间隔大小不是恒定的,就像整数一样。

事实上,IEEE 754 的设计使得相同符号的非 NaN 非无穷大值的比较可以通过与普通整数相同的操作来完成(同样,零故障)。因此,在这种特定情况下,您可以将这些数字视为“更好的整数”。

关于c++ - 浮点,我可以信任多少小于/大于比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374444/

相关文章:

java - java中的除法

cuda - 费米架构对我的比较研究可能有解决方案吗?

c - 为什么 "long double"类型的变量产生荒谬的输出,而 "float"和 "double"类型工作正常?

c++ - 是否存在从 std::shared_ptr<T> 到 std::shared_ptr<const T> 的隐式转换?

c++ - 图像二值化库的设计模式

bash - 如何根据语言环境变量格式化 float 以供显示?

java float转换为字符串给出不同的结果

c++ - 获取地址信息 : in what way is AI_PASSIVE ignored if the nodename is specified?

c++ - 用于接受 "\"的 C++ 正则表达式

c++ - 如何解决在 C++ 中 sin(M_PI) 不为 0 的事实?