max和fmax之间的差异(跨平台编译)

时间:2013-05-16 10:07:00

标签: c++ xcode visual-studio-2010

在Xcode中,编译很好:

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

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

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

任何想法为什么?

1 个答案:

答案 0 :(得分:17)

std::fmax标题(或std::fmin中的<cmath>fmax中的fmin<math.h>函数是C ++ 11功能以及许多其他新的数学函数 Visual Studio 2010 尚不支持( 2012 )。因此,为了便于移植,建议您从std::min替换std::max<algorithm>

实际差异在于,fminfmax是处理浮点数并且来自C99的数学函数(并且可能通过以下方式实现虽然可能是实际的专用CPU指令,而minmax是可用于支持<的任何类型的通用算法(并且可能只是一个简单的(b<a) ? b : a而不是浮点虽然实现甚至可以通过minmax的专业化来实现,但我对此表示怀疑。

对于特殊的浮点参数,它们的行为略微不同。虽然没有完全指定minmax将如何响应NaN,但我认为(尽管从上面的定义中它们应该始终返回第一个操作数),fmin并且fmax被明确指定为总是返回另一个(非NaN)参数,如果一个是NaN,如果实现符合IEEE 754(任何现代PC实现通常都是这样)。