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