发布于 2009-10-28 00:47:40
fmin
和fmax
专门用于浮点数(因此使用"f")。如果您将它用于int,您可能会因为转换、函数调用开销等而遭受性能或精度损失,这取决于您的编译器/平台。
std::min
和std::max
是模板函数(在header 中定义),它们使用小于(<
)运算符对任何类型进行操作,因此它们可以对允许进行这种比较的任何数据类型进行操作。如果您不想在<
上工作,也可以提供自己的比较函数。
这更安全,因为当参数具有不同的类型时,您必须显式转换参数以匹配它们。例如,编译器不会让您意外地将64位int转换为64位浮点型。仅此原因就应该使模板成为您的默认选择。(归功于Matthieu M& bk1e)
即使与浮点数一起使用,模板也可能在性能上赢得。编译器总是可以选择内联对模板函数的调用,因为源代码是编译单元的一部分。另一方面,有时不可能内联对库函数的调用(共享库,缺少链接时优化,等等)。
发布于 2015-06-18 20:22:27
std::min
、std::max
和fmin
与fmax
之间有一个重要的区别。
std::min(-0.0,0.0) = -0.0
std::max(-0.0,0.0) = -0.0
鉴于
fmin(-0.0, 0.0) = -0.0
fmax(-0.0, 0.0) = 0.0
因此,std::min
不是fmin
的1:1替代品。函数std::min
和std::max
是不可交换的。要获得与fmin
和fmax
的doubles相同的结果,应该交换参数
fmin(-0.0, 0.0) = std::min(-0.0, 0.0)
fmax(-0.0, 0.0) = std::max( 0.0, -0.0)
但就我所能告诉all these functions are implementation defined anyway in this case的是,要100%确定你必须测试它们是如何实现的。
还有另一个重要的区别。对于x ! = NaN
std::max(Nan,x) = NaN
std::max(x,NaN) = x
std::min(Nan,x) = NaN
std::min(x,NaN) = x
鉴于
fmax(Nan,x) = x
fmax(x,NaN) = x
fmin(Nan,x) = x
fmin(x,NaN) = x
可以用以下代码模拟fmax
double myfmax(double x, double y)
{
// z > nan for z != nan is required by C the standard
int xnan = isnan(x), ynan = isnan(y);
if(xnan || ynan) {
if(xnan && !ynan) return y;
if(!xnan && ynan) return x;
return x;
}
// +0 > -0 is preferred by C the standard
if(x==0 && y==0) {
int xs = signbit(x), ys = signbit(y);
if(xs && !ys) return y;
if(!xs && ys) return x;
return x;
}
return std::max(x,y);
}
这表明std::max
是fmax
的一个子集。
查看程序集可以看到,Clang为fmax
和fmin
使用了内置代码,而GCC则从一个数学库中调用它们。用于带有-O3
的fmax
的clang程序集为
movapd xmm2, xmm0
cmpunordsd xmm2, xmm2
movapd xmm3, xmm2
andpd xmm3, xmm1
maxsd xmm1, xmm0
andnpd xmm2, xmm1
orpd xmm2, xmm3
movapd xmm0, xmm2
而对于std::max(double, double)
,它只是简单地
maxsd xmm0, xmm1
然而,对于GCC和克朗来说,使用-Ofast
fmax
变得很简单
maxsd xmm0, xmm1
因此,这再次表明std::max
是fmax
的子集,并且当您使用没有nan
或带符号0的松散浮点模型时,fmax
和std::max
是相同的。显然,同样的论点也适用于fmin
和std::min
。
发布于 2010-11-02 00:35:44
您错过了fmin和fmax的全部要点。它被包括在C99中,以便现代CPU可以使用它们的本机(读取SSE)指令来处理浮点最小和最大浮点,并避免测试和分支(因此可能会预测错误的分支)。我重写了使用std::min和std::max的代码,以便在内部循环中使用SSE内部函数作为min和max,加速效果非常显著。
https://stackoverflow.com/questions/1632145
复制相似问题