ホームページ > バックエンド開発 > C++ > 浮動小数点キーで「std::map」を使用する方法: 不正確な比較の解決策?

浮動小数点キーで「std::map」を使用する方法: 不正確な比較の解決策?

DDD
リリース: 2024-11-14 22:15:03
オリジナル
655 人が閲覧しました

How to Use `std::map` with Floating-Point Keys: A Solution for Inaccurate Comparisons?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート