【问题标题】:The difference between max and fmax (Cross platform compiling)max和fmax的区别(跨平台编译)
【发布时间】:2013-05-11 04:14:14
【问题描述】:

在 Xcode 中,这编译得很好:

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

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

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

有什么想法吗?

【问题讨论】:

  • 我相信你的程序比那长一点(#include ?)
  • 嗯,一个起源于 C99,另一个起源于 C++98 ...
  • VS带来的实际错误是什么?顺便说一句,虽然 "distanceSqrdcRadius 也是浮点数",但 1.00.0 肯定不是。我希望你#included 或者<math.h> 或者,更优选的是<cmath>(在这种情况下,如果你在某处没有using,你也应该限定你的电话。而在VS中这不应该是必要时,当使用正确的 C++ 标头 <cmath> 时,不能保证这些函数在全局命名空间中可用。
  • 哦,等等,这些实际上是来自C++11<cmath> 的扩展,VS 还不支持。找到答案。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 2015-06-10
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多