在 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::fminfrom<cmath>标头(或fmax和fminfrom <math.h>)是 C++11 的一项功能,以及Visual Studio 2010尚不支持的许多其他新数学函数( 2012也不支持)。因此,为了便携性,建议将它们替换std::min为std::max.<algorithm>
实际的区别是,fminandfmax是处理浮点数的数学函数,起源于C99(并且可能在可能的情况下由实际的专用 CPU 指令实现),而minandmax是可用于任何类型支持的通用算法<(并且可能只是一个简单的(b<a) ? b : a而不是浮点指令,尽管实现甚至可以通过专门化minand来做到这一点max,但我对此表示怀疑)。
对于特殊的浮点参数,它们的行为也略有不同。虽然没有完全指定如何min以及max将如何响应NaNs,但我认为(尽管根据上述定义,它们应该始终返回第一个操作数),fmin并且fmax明确指定当一个参数是 时总是返回另一个(非NaN)参数NaN,如果实现符合 IEEE 754(任何现代 PC 实现通常都是如此)。