浮点数比较为什么没有相等的函数 在浮动指针号的C++标准中,有较大的比较,而较少的比较,那么为什么没有一个 STD::等值< /代码>用于相等比较?是否有安全准确的方法来检查double变量是否等于标准定义的DBL_MAX常数?我们尝试这样做的原因是我们通过服务协议访问数据,它定义了一个双字段,当没有可用数据时,它将发送DBL_MAX,因此在我们的客户机代码中,当它是DBL_MAX时,我们需要跳过它,以及需要处理它的任何其他内容

浮点数比较为什么没有相等的函数 在浮动指针号的C++标准中,有较大的比较,而较少的比较,那么为什么没有一个 STD::等值< /代码>用于相等比较?是否有安全准确的方法来检查double变量是否等于标准定义的DBL_MAX常数?我们尝试这样做的原因是我们通过服务协议访问数据,它定义了一个双字段,当没有可用数据时,它将发送DBL_MAX,因此在我们的客户机代码中,当它是DBL_MAX时,我们需要跳过它,以及需要处理它的任何其他内容,c++,c++11,floating-point,std,C++,C++11,Floating Point,Std,是否有一种安全准确的方法来检查双变量是否等于标准定义的DBL_MAX常数 当通过计算某个表达式获得浮点数时,由于精度有限和舍入错误,在大多数情况下比较是没有意义的。但是,如果您首先将浮点变量设置为某个值,则可以使用==将其与该值进行比较(某些例外情况如正零和负零) 例如: double v = std::numeric_limits<double>::max(); { conditional assignment to v of a non-double-max value } i

是否有一种安全准确的方法来检查双变量是否等于标准定义的
DBL_MAX
常数

当通过计算某个表达式获得浮点数时,由于精度有限和舍入错误,在大多数情况下比较是没有意义的。但是,如果您首先将浮点变量设置为某个值,则可以使用
==
将其与该值进行比较(某些例外情况如正零和负零)

例如:

double v = std::numeric_limits<double>::max();
{ conditional assignment to v of a non-double-max value }

if (v != std::numeric_limits<double>::max())
    process(v);
double v=std::numeric_limits::max();
{非双最大值的v的条件赋值}
如果(v!=std::numeric_limits::max())
过程(五);

std::numeric\u limits::max()
完全可以表示为
double
(它是
double
),因此这种比较应该是安全的,除非重新分配
v
,否则永远不会产生
true

到浮点之间的相等函数没有意义,因为浮点数有舍入

因此,如果要比较两个浮点数是否相等,最好的方法是声明一个重要的epsilon(错误)进行比较,然后验证第一个数字是否在第二个数字左右

为此,您可以验证第一个数字是否大于第二个数字减去ε以及第一个数字是否小于第二个数字加ε。 前

if(first>second-epsilon&&first
相比,
=
的兴趣更大,因为比较浮点数是否相等效果不好,因为它们会出现舍入错误。我想这会对你有所帮助。请看你问题右侧的相关问题列表,其中许多问题会解释为什么浮点等式比较通常是不可能的。比较本质上不准确的等式数字有什么实际用途?尤其是
DBL_MAX
,这是一个非常大的数字,但精度却非常低?如果你告诉我们你到底想做什么,也许我们可以找到一个更好的解决方案。为什么不
a==b
?@fluter如果你“读到”某个地方“操作符
=
不适用于
float
/
double
”那么你需要做更多的阅读,因为那不是真的。事实上,这完全是危险的。假设的
std::isequal
也不能解决这个问题。请参阅。测试此比较是否为
first=second=DBL_MAX
。是的,如果两个数字等于DBL_MAX,他可以进行比较,但只有在初始化后未执行任何操作时才可能进行比较。然而,正确的表达式是
first==second==DBL_MAX
,尽管近似相等测试有时很有用,但请不要建议将其作为相等的默认替换,因为它们缺少相等的重要属性,如传递性。是的,应用此比较时传递性属性丢失的逻辑,但在任何情况下,传递性属性在数字的舍入过程中已经丢失。。。这只是精确性的问题。因此传递性属性被保持在一个精度以下或某个小数位。Evg指出,当
first=second=DBL_MAX
时,该函数将返回false,即使这些数字在任何意义上都相等。同样的情况发生在任何比你选择的
1/epsilon
大的双精度上-你永远不会得到相等的
second-epsilon==second==first
second+epsilon==second==first
,所以
我很好奇为什么会有意义,因为两个操作数上都可能存在累积错误,导致错误结果,与for==非常相似。即使是额外的精度(如80位寄存器)也可能会导致平凡情况下的灾难性结果。例如,由于IEEE754 double 1/10为圆形上方,因此长双x=1.0/10.0;很可能被认为std::isless
/
std::isgreater
的作用是不同的,那么也会被破坏,毫无意义。所有比较的精确性问题仍然存在。从这个意义上说,它们都是“破碎的”。所以你同意正确的答案是不提出例外,而不是因为不准确而没有意义,就像一位程序员解释的那样。@aka.nice,我同意。但OP提出了两个问题。第一个是关于
std::isgrear
std::isless
。第二个是关于如何检测
DBL\u MAX
。一个程序员回答了第一个问题,我回答了第二个问题。但我们不知道所使用的协议,如果它是通过的ASCII十进制值,则必须对其进行解码,并且这些计算也需要一些保证。。。
if ( first > second - epsilon && first < second + epsilon ){
          //The numbers are equal
    }else{
          //The numbers are not equal
    }