12

Xcode では、これは正常にコンパイルされます。

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

ただし、Visual Studio 2010 ではエラーが発生し、fmax の代わりに max を使用する必要があります。distanceSqrd と cRadius も両方とも float です。

シームレスにクロスコンパイルしないのは私のコードの唯一の部分です...

理由はありますか?

4

1 に答える 1

21

関数std::fmaxand std::fminfrom the <cmath>header (またはfmaxand fminfrom <math.h>) は C++11 の機能であり、他の多くの新しい数学関数と共に、Visual Studio 2010ではまだサポートされていません (どちらも2012もサポートしていません)。したがって、移植性のために、それらをstd::minおよびstd::maxから置き換えることをお勧めし<algorithm>ます。

実際の違いは、fminfmaxは浮動小数点数を処理する数学関数でありC99(可能であれば、実際の特殊な CPU 命令によって本質的に実装される可能性minがあります)、とmaxはサポートする任意の型で使用できる一般的なアルゴリズムです<(そしておそらく単純な浮動小数点命令の代わりに、実装はand(b<a) ? b : aの特殊化でそれを行うことさえできますが、私はこれを疑っています)。minmax

また、特殊な浮動小数点引数の場合、動作がわずかに異なります。mins にどのようにmax応答するかは完全には指定されていませんがNaN、(上記の定義から、常に第 1 オペランドを返す必要があります)とfmin思いfmaxます。実装は IEEE 754 準拠です (最近の PC 実装は通常そうです)。NaNNaN

于 2013-05-16T10:49:14.140 に答える