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