C++ 使用std::max比较两个double是否安全?

C++ 使用std::max比较两个double是否安全?,c++,c++11,C++,C++11,我知道为了比较两个双打,我们必须这样做 bool AreSame(double a, double b) { return fabs(a - b) < EPSILON; } 链接到页面 (相对差值为10^-6)std::max与相等无关,它只关心两个数字不相等时。此外,epsilon问题与寻找近似相等的数字有关,这些数字的差异是由浮点错误引起的。浮点错误会导致std::max选择一个而不是另一个,因为std::max无法知道什么是合适的epsilon 请记住,您的系统可能需要ar

我知道为了比较两个双打,我们必须这样做

bool AreSame(double a, double b)
{
    return fabs(a - b) < EPSILON;
}
链接到页面


(相对差值为10^-6)

std::max与相等无关,它只关心两个数字不相等时。此外,epsilon问题与寻找近似相等的数字有关,这些数字的差异是由浮点错误引起的。浮点错误会导致
std::max
选择一个而不是另一个,因为
std::max
无法知道什么是合适的epsilon


请记住,您的系统可能需要
arame(0.1000001,0.1)=true
,但
std::max(0.1000001,0.1)
应返回
0.1000001
,以防您在意。

std::max
与相等无关,它只关心两个数字不相等时。此外,epsilon问题与寻找近似相等的数字有关,这些数字的差异是由浮点错误引起的。浮点错误会导致
std::max
选择一个而不是另一个,因为
std::max
无法知道什么是合适的epsilon


请记住,您的系统可能需要
arame(0.1000001,0.1)=true
,但是
std::max(0.1000001,0.1)
应该返回
0.1000001
,以防您在意。

(正如您刚才对问题的修改)max应该做一个简单的“(正如您刚才对问题的修改)max应该做一个简单的“我认为在使用
fabs(a-b)
通常不可靠:较大的
a
和/或
b
值需要较大的
ε
,而两个较小的值需要较小的
ε
。毫无疑问,S.O.上的其他地方都在问和回答如何正确操作……我认为如果不安全,他们不会为
double
创建
std::max
专门化。如果他们有,可能会有关于它的使用的大警告/警告。你的担心似乎放错地方了。“浮点”并不意味着“在任何地方都应该使用ε”。阅读“每一位计算机科学家都应该知道的浮点运算”这篇文章,这篇文章到处都有提及,而且在互联网上有多个镜像。是的!我知道了!我从书上读错了!我认为使用
fabs(a-b)
通常不可靠:较大的
a
和/或
b
值需要较大的
ε
,而两个较小的值需要较小的
ε
。毫无疑问,S.O.上的其他地方都在问和回答如何正确操作……我认为如果不安全,他们不会为
double
创建
std::max
专门化。如果他们有,可能会有关于它的使用的大警告/警告。你的担心似乎放错地方了。“浮点”并不意味着“在任何地方都应该使用ε”。阅读“每一位计算机科学家都应该知道的浮点运算”这篇文章,这篇文章到处都有提及,而且在互联网上有多个镜像。是的!我知道了!我从书上读错了!可能值得注意的是,选择
(aa)?b:a
当其中一个操作数是
NaN
时,第一个操作数给出
max(NaN,1.0)=NaN
,但第二个操作数给出
max(NaN,1.0)=1
,因此如果我将3.145551与3.145552进行比较,答案总是正确的(相对差值为10^{-6})?我完全生活在黑暗中,相信我们甚至不能比较不平等!也就是说,我们不能用<,>,检查双值。可能是我在C++书中读得不好。我想告诉你,我是在比较小数(而不是像22/7这样的非终止数字)@MichaelAnderson:max(1.0,NaN)
呢?IEEE 754-2008标准指出,特别是对于最大和最小函数,NaN表示“缺少数据”,因此它应该始终返回非NaN参数。这就是行为方式(如果支持IEC 60559)。@Ishu Yes如果您将3.145551与3.145552进行比较,这将适用于浮点(32位)和双精度(64位),但如果这些值大于7位,则将超出浮点的精度,这可能会导致舍入,这可能会导致意外的结果可能值得注意的是,选择
(aa)?b:a
当其中一个操作数是a
NaN
时,第一个操作数给出
max(NaN,1.0)=NaN
,但第二个操作数给出
max(NaN,1.0)=1
,因此如果我将3.145551与3.145552进行比较,答案总是正确的(C++中的相对差值是10 ^ { 6 })?我完全生活在黑暗中,我们甚至无法比较不等式,也就是说,我们不能用<,>来检查双值。也许我没有在我的C++书中读得很好。@MichaelAnderson:max(1.0,NaN)
?IEEE 754-2008标准规定,特别是对于最大值和最小值函数,NaN意味着“丢失数据”,因此它应该始终返回非NaN参数。这就是行为方式(如果支持IEC 60559)。@Ishu Yes如果将3.145551和3.145552进行比较,这将适用于这两个浮点值(32位)和双精度(64位),但如果这些值大于7位,则会超出浮点的精度,这可能会导致舍入,从而导致意外结果
template <class T> const T& max (const T& a, const T& b) {
  return (a<b)?b:a;     // or: return comp(a,b)?b:a; for version (2)
}
(a < b) ? b : a