std::map 浮動小数点キーの比較
std::maps で浮動小数点値をキーとして使用すると、次のような問題が発生する可能性があります。浮動小数点演算に固有の不正確さ。よくある問題の 1 つは、厳密な等価性 (==) を使用した浮動小数点キーの比較が常に期待どおりに機能するとは限らないことです。正確に見える値であっても、精度誤差により一致しない可能性があるためです。
指定されたコード例では、ループは std::map でキー 3.0 を検索しようとしますが、ループが = 0.1 を使用して検索キーをインクリメントするため失敗します。これは、浮動小数点精度の不正確さにより、期待されるキー値と正確に一致しない可能性があります。
この問題に対処するには、プログラムで std::setprecision 関数を使用して、キーを比較するときに考慮する小数点以下の桁数を指定します。ただし、キーが正確に比較されることが保証されていないため、このアプローチは依然として信頼性が低い可能性があります。
より良い解決策は、std::map で近似比較関数を使用することです。イプシロンしきい値を使用してキーの同等性を判断するカスタム コンパレーターを定義できます。これにより、小さな精度の違いを効果的に無視して、特定の許容範囲内でキーを比較できます:
struct fuzzy_double_comparator { bool operator() (const double a, const double b) const { return std::fabs(a - b) < epsilon; } };
このコンパレータ関数を std::map コンストラクターに渡して近似比較を使用できます:
std::map<double, double, fuzzy_double_comparator> mymap;
このアプローチを使用すると、浮動小数点精度の制限により実際の値がわずかに異なる場合でも、std::map でキー 3.0 を見つけることができます。
以上が浮動小数点キーで「std::map」を使用する方法: 不正確な比較の解決策?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。