C++ 我们能用吗!islessgreater(浮点a,浮点b)检查a==b,前提是a和b都不是nan
为了检查两个浮点变量是否相等,我们不能使用像a==b这样的东西。但是使用头文件中的islessgreater()函数怎么样 在C++11中,有三个重载,如下所示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 我知道很多人都有一些变通方法来检查两个浮点
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
表示您不知道自己在做什么。