【问题标题】:Can we use !islessgreater(float a, float b) to check a==b given both a and b are not nan我们可以使用 !islessgreater(float a, float b) 来检查 a==b 给定 a 和 b 都不是 nan
【发布时间】:2020-01-03 12:09:00
【问题描述】:

要检查两个浮点变量是否相等,我们不能使用 a==b 之类的东西。但是如何使用头文件中的 islessgreater() 函数呢?

从 C++11 开始,有如下三个重载

bool islessgreater (float x      , float y);
bool islessgreater (double x     , double y);
bool islessgreater (long double x, long double y);

编辑 #1 我知道有一些解决方法可以检查很多人的两个浮点变量的相等性。例如, Floating-point Comparison From Boost How to correctly and standardly compare floats?

我关心的是我们是否可以使用 C++11 中的标准函数 islessgreater() 来检查 (float a == float b) 与否? 例如

int main() {

    float a = 1E-10;
    float b = 1.001E-10;

    bool res = !isnan(a) && !isnan(b) && !islessgreater(a, b);

    std::cout << std::boolalpha;

    if (res) std::cout << "a == b" << endl;
    else std::cout << "a != b" << endl;

    return 0;
}

【问题讨论】:

  • 通常您使用 epsilon 来比较浮点值。一般采用abs(x - y) &lt; SELECTED_EPSILON的形式。如果该条件为真,则认为值相等。
  • "要检查两个浮点变量是否相等,我们不能使用 a==b 之类的东西"。你介意提供你的理由吗?是因为存在 NaN 还是某些“基于精度”的原因?
  • islessgreater(a, b)等价于a &lt; b || a &gt; b,由于nan没有设置浮点异常,所以不如检查a == b。此外,“我们不能使用 a==b 之类的东西” 是一个过于宽泛的说法,在某些情况下,== 显然可以用于比较浮点数。
  • 关于不将浮点值与== 进行比较的准则的原因是,由于计算中的精度损失,可能预期相等的值不会比较相等。没有解决方法 - 仅使用具有某些特定适用性但不通用的技术(例如abs(x-y) &lt;&lt; std::numeric_limits&lt;float_type&gt;::epsilon.

标签: c++ floating-point-comparison


【解决方案1】:

我不知道你为什么提到 x == y 不起作用。以下代码在 C++ 中完美地用于比较两个浮点变量:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main() {
    bool result;
    float x = 5.1235;
    float y = 5.1235;
    result = x == y;
    cout << result;
    return 0;
}

【讨论】:

猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 2018-11-22
  • 2021-10-06
  • 2021-11-28
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多