C++ 我们能用吗!islessgreater(浮点a,浮点b)检查a==b,前提是a和b都不是nan

C++ 我们能用吗!islessgreater(浮点a,浮点b)检查a==b,前提是a和b都不是nan,c++,floating-point-comparison,C++,Floating Point Comparison,为了检查两个浮点变量是否相等,我们不能使用像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 我知道很多人都有一些变通方法来检查两个浮点

为了检查两个浮点变量是否相等,我们不能使用像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 我知道很多人都有一些变通方法来检查两个浮点变量的相等性。例如

我关心的是,我们是否可以使用C++11中的标准函数islessmorer()来检查(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;
}
intmain(){
浮子a=1E-10;
浮子b=1.001E-10;
bool res=!isnan(a)和&!isnan(b)和&!islessgreater(a,b);

Std::Couth

我不知道为什么你提到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;
}
#包括
#包括
使用名称空间std;
int main(){
布尔结果;
浮动x=5.1235;
浮动y=5.1235;
结果=x==y;

CUT通常使用ε来比较浮点值。通常以“代码> ABS(X-Y)”的形式选择Sead Type EpSimon < /C>。如果条件是真的,那么考虑值相等。“为了检查两个浮点变量是否相等,我们不能使用类似A==B的东西”。。您是否介意提供您对此的推理?这是由于NaN的存在还是某种“基于精度”的原因?
IslessMorger(a,b)
相当于
ab
,没有设置NaN引起的浮点异常,因此它并不比检查
a==b
更好。此外,“我们不能使用像a==b这样的东西"是一个过于宽泛的语句,在某些上下文中,
=
显然适合比较浮点数。另请参见此处:不将浮点数与
=
进行比较的指导原则的原因是,由于计算中的精度损失,可能预期相等的值将不会进行比较。因此e不是解决方法-仅使用具有特定适用性但不通用的技术(例如
abs(x-y))请参阅检查浮点数是否相等并不总是一个好主意。尽管您的示例有效,但请参考以下链接。和和。除非不可移植,否则此答案是正确的。当然,您可以比较浮点数。您只需要知道自己在做什么。特别是,您需要知道数字错误(如果有)是如何累积的你的计算。只有到那时你才知道你应该如何在任何比较中发出一些宽容。abs(x-y)epsilon
表示您不知道自己在做什么。