max和fmax之间的区别(跨平台编译)

The difference between max and fmax (Cross platform compiling)

本文关键字:跨平台 编译 区别 fmax 之间 max      更新时间:2023-10-16

在Xcode中,这段代码编译得很好:

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

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

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

知道为什么吗?

函数std::fmaxstd::fmin来自<cmath>头(或fmaxfmin来自<math.h>)是c++ 11的一个特性,并且与许多其他新的数学函数一起Visual Studio 2010还不支持(2012也不支持)。因此,为了可移植性,建议将<algorithm>替换为std::minstd::max

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

对于特殊的浮点数参数,它们的行为也略有不同。虽然没有完全指定minmax将如何响应NaN s,但我认为(尽管从上述定义中它们应该始终返回第一个操作数),fminfmax被明确指定为在NaN时始终返回另一个(非NaN)参数,如果实现是IEEE 754一致性(任何现代PC实现通常是)。