Xcode では、これは正常にコンパイルされます。
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
ただし、Visual Studio 2010 ではエラーが発生し、fmax の代わりに max を使用する必要があります。distanceSqrd と cRadius も両方とも float です。
シームレスにクロスコンパイルしないのは私のコードの唯一の部分です...
理由はありますか?
Xcode では、これは正常にコンパイルされます。
float falloff = fmin(1.0, fmax(0.0, distanceSqrd/cRadius));
ただし、Visual Studio 2010 ではエラーが発生し、fmax の代わりに max を使用する必要があります。distanceSqrd と cRadius も両方とも float です。
シームレスにクロスコンパイルしないのは私のコードの唯一の部分です...
理由はありますか?
関数std::fmax
and std::fmin
from the <cmath>
header (またはfmax
and fmin
from <math.h>
) は C++11 の機能であり、他の多くの新しい数学関数と共に、Visual Studio 2010ではまだサポートされていません (どちらも2012もサポートしていません)。したがって、移植性のために、それらをstd::min
およびstd::max
から置き換えることをお勧めし<algorithm>
ます。
実際の違いは、fmin
とfmax
は浮動小数点数を処理する数学関数でありC99
(可能であれば、実際の特殊な CPU 命令によって本質的に実装される可能性min
があります)、とmax
はサポートする任意の型で使用できる一般的なアルゴリズムです<
(そしておそらく単純な浮動小数点命令の代わりに、実装はand(b<a) ? b : a
の特殊化でそれを行うことさえできますが、私はこれを疑っています)。min
max
また、特殊な浮動小数点引数の場合、動作がわずかに異なります。min
s にどのようにmax
応答するかは完全には指定されていませんがNaN
、(上記の定義から、常に第 1 オペランドを返す必要があります)とfmin
思いfmax
ます。実装は IEEE 754 準拠です (最近の PC 実装は通常そうです)。NaN
NaN