82

C++ では、 and はand std::min?よりもstd::max望ましいです。2 つの整数を比較する場合、基本的に同じ機能を提供しますか?fminfmax

これらの関数セットのいずれかを使用する傾向がありますか、それとも独自の関数を作成することを好みますか (おそらく、効率、移植性、柔軟性などを向上させるため)?

ノート:

  1. C++ 標準テンプレート ライブラリ (STL)は、標準 C++アルゴリズムヘッダーで 関数minと関数を宣言します。max

  2. C 標準 (C99) は、標準 C のmath.hヘッダーにfminandfmax関数を提供します。

前もって感謝します!

4

14 に答える 14

119

fminおよびfmax特に浮動小数点数で使用するためのものです(したがって「f」)。int に使用すると、コンパイラ/プラットフォームによっては、変換、関数呼び出しのオーバーヘッドなどにより、パフォーマンスや精度が低下する可能性があります。

std::minおよびは、より小さい ( ) 演算子を使用して任意の型でstd::max機能するテンプレート関数 ( header で定義) であるため、そのような比較が可能な任意のデータ型で動作できます。動作させたくない場合は、独自の比較関数を提供することもできます。<algorithm><<

引数の型が異なる場合は、一致するように引数を明示的に変換する必要があるため、これはより安全です。たとえば、コンパイラでは、誤って 64 ビットの int を 64 ビットの float に変換することはできません。この理由だけで、テンプレートをデフォルトの選択肢にする必要があります。(Matthieu M & bk1e の功績)

フロートを使用した場合でも、テンプレートパフォーマンスに勝る場合があります。ソースコードはコンパイル単位の一部であるため、コンパイラには常にテンプレート関数の呼び出しをインライン化するオプションがあります。一方、ライブラリ関数の呼び出しをインライン化できない場合もあります (共有ライブラリ、リンク時の最適化の欠如など)。

于 2009-10-27T16:47:40.427 に答える
17

fmin と fmax のポイント全体が欠落しています。C99 に含まれていたのは、最新の CPU が浮動小数点の最小値と最大値にネイティブの (SSE を読み取る) 命令を使用し、テストと分岐 (したがって、誤って予測された分岐の可能性) を回避できるようにするためです。std::min と std::max を使用していたコードを書き直して、代わりに内部ループの min と max に SSE 組み込み関数を使用したところ、速度が大幅に向上しました。

于 2010-11-01T16:35:44.483 に答える
6

std::min と std::max はテンプレートです。そのため、float、double、long double など、小なり演算子を提供するさまざまな型で使用できます。したがって、一般的な C++ コードを書きたい場合は、次のようにします。

template<typename T>
T const& max3(T const& a, T const& b, T const& c)
{
   using std::max;
   return max(max(a,b),c); // non-qualified max allows ADL
}

パフォーマンスに関しては、私はC++ の対応物fminとは違いないと思います。fmax

于 2009-10-27T16:49:12.153 に答える
6

実装で 64 ビット整数型が提供されている場合、fmin または fmax を使用すると、異なる (不正確な) 回答が得られる可能性があります。64 ビット整数は double に変換され、(少なくとも通常は) 64 ビットより小さい仮数を持ちます。このような数値を double に変換すると、最下位ビットの一部が完全に失われる可能性があります。

これは、実際には異なる 2 つの数値が、double に変換されると最終的に等しくなる可能性があることを意味します。結果は、元の入力のいずれかと必ずしも等しいとは限らない、誤った数値になります。

于 2009-10-27T16:55:18.210 に答える
4

C++ を使用している場合は、型固有であるため、C++ の min/max 関数を使用することをお勧めします。fmin/fmax は、すべてを強制的に浮動小数点との間で変換します。

また、C++ の最小/最大関数は、それらの型に対して operator< を定義している限り、ユーザー定義型で機能します。

HTH

于 2009-10-27T16:48:21.700 に答える
2

ご指摘のとおりfminfmaxC99 で導入されました。fmin標準 C++ ライブラリにはand関数がありませんfmax。C99 標準ライブラリが C++ に組み込まれるまで (もしあれば)、これらの関数のアプリケーション領域は明確に分離されています。どちらかを「優先」しなければならない状況はありません。

テンプレート化されたstd::min/std::maxを C++ で使用するだけで、C で使用できるものは何でも使用できます。

于 2009-10-27T16:54:31.563 に答える
2

Richard Corden が指摘したように、std 名前空間で定義された C++ 関数 min および max を使用します。それらは型の安全性を提供し、混合型 (つまり、浮動小数点と整数) の比較を回避するのに役立ちます。

使用している C++ ライブラリが min/max をマクロとしても定義している場合は、競合が発生する可能性があります。この方法で min/max 関数を呼び出す不要なマクロ置換を防ぐことができます (余分な括弧に注意してください)。

(std::min)(x, y)
(std::max)(x, y)

ADL に依存する必要がある場合は、これによりArgument Dependent Lookup (ADL、Koenig ルックアップとも呼ばれます)が効果的に無効になることに注意してください。

于 2010-01-24T00:06:17.373 に答える
1

ちなみに、cstdlibあり__min__max使用できます。

詳細: http: //msdn.microsoft.com/zh-cn/library/btkhtd8d.aspx

于 2012-03-11T15:24:36.650 に答える
1

fmin と fmax は、浮動小数点変数と double 変数専用です。

min と max は、2 項述語が与えられた場合に、任意の型の比較を可能にするテンプレート関数です。また、複雑な機能を提供するために他のアルゴリズムと併用することもできます。

于 2009-10-27T16:49:56.473 に答える
1

SSE 命令を使用するプロセッサをターゲットとする C++ 実装では、それぞれfminf 、 fmin 、および fminl同等floatdoubleおよびlong double型のstd::minおよびstd::maxの特殊化を提供できませんでしたか?

特殊化により、浮動小数点型のパフォーマンスが向上しますが、一般的なテンプレートは、fminfmaxのように浮動小数点型を浮動小数点型に強制しようとすることなく、非浮動小数点型を処理します。

于 2016-02-09T22:31:41.700 に答える
0

int には常に min マクロと max マクロを使用します。整数値に fmin または fmax を使用する理由がわかりません。

min と max に関する大きな落とし穴は、それらが関数のように見えても関数ではないということです。次のようなことをすると:

min (10, BigExpensiveFunctionCall())

マクロの実装によっては、その関数呼び出しが 2 回呼び出される場合があります。そのため、私の組織では、リテラルまたは変数ではないもので min または max を呼び出さないことがベスト プラクティスです。

于 2009-10-27T16:46:22.380 に答える
0

fminおよびfmax、 of fminl、およびfmaxlは、符号付き整数と符号なし整数を比較するときに優先される可能性があります-符号付きおよび符号なし数値の範囲全体を利用でき、整数範囲とプロモーションについて心配する必要はありません。

unsigned int x = 4000000000;
int y = -1;

int z = min(x, y);
z = (int)fmin(x, y);
于 2009-10-27T17:03:42.780 に答える