12

在 Xcode 中,这编译得很好:

float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));

但是在 Visual Studio 2010 中它会出错,我必须使用 max 而不是 fmax。distanceSqrd 和 cRadius 也是浮点数。

这是我的代码中唯一不能无缝交叉编译的部分......

任何想法为什么?

4

1 回答 1

21

函数std::fmaxstd::fminfrom<cmath>标头(或fmaxfminfrom <math.h>)是 C++11 的一项功能,以及Visual Studio 2010尚不支持的许多其他新数学函数( 2012也不支持)。因此,为了便携性,建议将它们替换std::minstd::max.<algorithm>

实际的区别是,fminandfmax是处理浮点数的数学函数,起源于C99(并且可能在可能的情况下由实际的专用 CPU 指令实现),而minandmax是可用于任何类型支持的通用算法<(并且可能只是一个简单的(b<a) ? b : a而不是浮点指令,尽管实现甚至可以通过专门化minand来做到这一点max,但我对此表示怀疑)。

对于特殊的浮点参数,它们的行为也略有不同。虽然没有完全指定如何min以及max将如何响应NaNs,但我认为(尽管根据上述定义,它们应该始终返回第一个操作数),fmin并且fmax明确指定当一个参数是 时总是返回另一个(非NaN)参数NaN,如果实现符合 IEEE 754(任何现代 PC 实现通常都是如此)。

于 2013-05-16T10:49:14.140 回答