在Xcode中,这个可以正常编译:
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
然而在Visual Studio 2010中会出错,我不得不使用max代替fmax。distanceSqrd和cRadius都是浮点型。
这是我代码中唯一无法无缝跨平台编译的部分...
有什么想法吗?
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
然而在Visual Studio 2010中会出错,我不得不使用max代替fmax。distanceSqrd和cRadius都是浮点型。
这是我代码中唯一无法无缝跨平台编译的部分...
有什么想法吗?
std::fmax
和 std::fmin
是来自于 <cmath>
头文件(或者来自于 <math.h>
的 fmax
和 fmin
)的 C++11 特性之一,和许多其他新数学函数一样,Visual Studio 2010(以及2012)还不支持。所以为了可移植性,建议用来自 <algorithm>
的 std::min
和 std::max
代替它们。
实际上,fmin
和 fmax
是在浮点数上工作的数学函数,源自于 C99
(并且可能会在可能的情况下由实际专门的 CPU 指令内在实现),而 min
和 max
是通用算法,可用于任何支持 <
的类型(并且可能只是一个简单的 (b<a) ? b : a
而不是浮点指令,尽管实现甚至可以使用 min
和 max
的特化来完成这个操作,但我对此表示怀疑)。
对于特殊的浮点参数,它们的行为也略有不同。虽然并没有完全指定 min
和 max
如何响应 NaN
,但我认为(尽管从上述定义来看,它们应该总是返回第一个操作数),fmin
和 fmax
在实现符合 IEEE 754 的情况下被明确指定为当有一个参数为 NaN
时总是返回另一个(非 NaN
)参数。
#include
?) - Marc GlissedistanceSqrd
和cRadius
也都是浮点数",但1.0
和0.0
显然不是。我希望你已经包含了<math.h>
或者更好的是<cmath>
(如果你没有使用using
,那么你应该限定你的调用)。在VS中这不是必需的,但当使用正确的C++头文件<cmath>
时,不能保证这些函数在全局命名空间中可用。 - Christian RauC++11
对<cmath>
的扩展,而VS目前还不支持。答案找到了。 - Christian Rau