在 Xcode 中,这编译得很好:
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
但是在 Visual Studio 2010 中它会出错,我必须使用 max 而不是 fmax。distanceSqrd 和 cRadius 也是浮点数。
这是我的代码中唯一不能无缝交叉编译的部分......
任何想法为什么?
在 Xcode 中,这编译得很好:
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
但是在 Visual Studio 2010 中它会出错,我必须使用 max 而不是 fmax。distanceSqrd 和 cRadius 也是浮点数。
这是我的代码中唯一不能无缝交叉编译的部分......
任何想法为什么?
函数std::fmax
和std::fmin
from<cmath>
标头(或fmax
和fmin
from <math.h>
)是 C++11 的一项功能,以及Visual Studio 2010尚不支持的许多其他新数学函数( 2012也不支持)。因此,为了便携性,建议将它们替换std::min
为std::max
.<algorithm>
实际的区别是,fmin
andfmax
是处理浮点数的数学函数,起源于C99
(并且可能在可能的情况下由实际的专用 CPU 指令实现),而min
andmax
是可用于任何类型支持的通用算法<
(并且可能只是一个简单的(b<a) ? b : a
而不是浮点指令,尽管实现甚至可以通过专门化min
and来做到这一点max
,但我对此表示怀疑)。
对于特殊的浮点参数,它们的行为也略有不同。虽然没有完全指定如何min
以及max
将如何响应NaN
s,但我认为(尽管根据上述定义,它们应该始终返回第一个操作数),fmin
并且fmax
明确指定当一个参数是 时总是返回另一个(非NaN
)参数NaN
,如果实现符合 IEEE 754(任何现代 PC 实现通常都是如此)。