max和fmax的区别(跨平台编译)

13
在Xcode中,这个可以正常编译:
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));

然而在Visual Studio 2010中会出错,我不得不使用max代替fmax。distanceSqrd和cRadius都是浮点型。

这是我代码中唯一无法无缝跨平台编译的部分...

有什么想法吗?


我相信你的程序比那个长一点(#include?) - Marc Glisse
嗯,一个起源于C99,另一个起源于C++98... - PlasmaHH
实际错误是什么?顺便说一下,虽然 "distanceSqrdcRadius也都是浮点数",但1.00.0显然不是。我希望你已经包含了<math.h>或者更好的是<cmath>(如果你没有使用using,那么你应该限定你的调用)。在VS中这不是必需的,但当使用正确的C++头文件<cmath>时,不能保证这些函数在全局命名空间中可用。 - Christian Rau
1
哦,等等,那些实际上是来自于C++11<cmath>的扩展,而VS目前还不支持。答案找到了。 - Christian Rau
1个回答

24
std::fmaxstd::fmin 是来自于 <cmath> 头文件(或者来自于 <math.h>fmaxfmin)的 C++11 特性之一,和许多其他新数学函数一样,Visual Studio 2010(以及2012)还不支持。所以为了可移植性,建议用来自 <algorithm>std::minstd::max 代替它们。

实际上,fminfmax 是在浮点数上工作的数学函数,源自于 C99 (并且可能会在可能的情况下由实际专门的 CPU 指令内在实现),而 minmax 是通用算法,可用于任何支持 < 的类型(并且可能只是一个简单的 (b<a) ? b : a 而不是浮点指令,尽管实现甚至可以使用 minmax 的特化来完成这个操作,但我对此表示怀疑)。

对于特殊的浮点参数,它们的行为也略有不同。虽然并没有完全指定 minmax 如何响应 NaN,但我认为(尽管从上述定义来看,它们应该总是返回第一个操作数),fminfmax 在实现符合 IEEE 754 的情况下被明确指定为当有一个参数为 NaN 时总是返回另一个(非 NaN)参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接