max和fmax之间的区别(跨平台编译)
The difference between max and fmax (Cross platform compiling)
在Xcode中,这段代码编译得很好:
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
然而在Visual Studio 2010中,它出错了,我不得不使用max而不是fmax。distanceSqrd和cRadius也都是浮点数
这是我的代码中唯一没有无缝交叉编译的部分…
知道为什么吗?
函数std::fmax
和std::fmin
来自<cmath>
头(或fmax
和fmin
来自<math.h>
)是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
s,但我认为(尽管从上述定义中它们应该始终返回第一个操作数),fmin
和fmax
被明确指定为在NaN
时始终返回另一个(非NaN
)参数,如果实现是IEEE 754一致性(任何现代PC实现通常是)。