[解決済み] 浮動小数点数の比較はどのようにすればよいのですか?
質問
私は現在、以下のようなコードを書いています。
double a = SomeCalculation1();
double b = SomeCalculation2();
if (a < b)
DoSomething2();
else if (a > b)
DoSomething3();
そして、他の場所では、等式を行う必要があるかもしれません。
double a = SomeCalculation3();
double b = SomeCalculation4();
if (a == 0.0)
DoSomethingUseful(1 / a);
if (b == 0.0)
return 0; // or something else here
要するに、浮動小数点演算がたくさん行われていて、条件のためにいろいろな比較をする必要があるのです。この文脈ではそんなことは無意味なので、整数演算に変換することはできない。
こんなことがあり得るので、浮動小数点数の比較は信頼性に欠けると以前読んだことがあります。
double a = 1.0 / 3.0;
double b = a + a + a;
if ((3 * a) != b)
Console.WriteLine("Oh no!");
要するに、私は知りたいのです。浮動小数点数の比較 (より小さい、より大きい、等しい) を確実に行うにはどうしたらよいでしょうか。
私が使用している数値範囲は、およそ10E-14から10E6までなので、大きな数値だけでなく小さな数値も扱う必要があります。
私はどの言語を使用しているかに関係なく、これを達成する方法に興味があるので、私はこれを言語に依存しないとしてタグ付けしました。
どのように解決するのですか?
大小の比較は、float/倍精度の限界ぎりぎりで作業していない限り、実際には問題にはなりません。
fuzzy equals" の比較のために、次のようなものを思いつきました (Java コードです。簡単に適用できるはずです)。 浮動小数点数ガイド のために、多くの作業と多くの批判を考慮した結果です。
public static boolean nearlyEqual(float a, float b, float epsilon) {
final float absA = Math.abs(a);
final float absB = Math.abs(b);
final float diff = Math.abs(a - b);
if (a == b) { // shortcut, handles infinities
return true;
} else if (a == 0 || b == 0 || diff < Float.MIN_NORMAL) {
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * Float.MIN_NORMAL);
} else { // use relative error
return diff / (absA + absB) < epsilon;
}
}
テストスイートが付属しています。なぜなら、1つの値0、0と反対の2つの非常に小さな値、または無限大のようないくつかのエッジケースで失敗することが事実上保証されているからです。
代替案 (詳細については上記のリンクを参照) は、浮動小数点数のビット パターンを整数に変換し、一定の整数の距離内のすべてを受け入れることです。
いずれにせよ、すべてのアプリケーションに完璧に対応するソリューションはおそらく存在しません。理想的には、実際の使用事例をカバーするテスト スイートで独自のものを開発/適応させることです。
関連
-
[解決済み] O(N log N)の複雑さ - 線形に似ている?
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] 文字列が数値(float)であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] 関数は return 文を1つだけ持つべきですか?
-
[解決済み] 除算を強制的に浮動小数点にするにはどうしたらいいですか?除算は0に切り捨てられ続けますか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
-
[解決済み] 大文字と小文字を区別しない文字列比較を行うにはどうすればよいですか?
-
[解決済み】浮動小数点値の比較はどのくらい危険か?
-
[解決済み】引数かパラメータか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Mac OS X で DYLD_LIBRARY_PATH を使ってもいいのでしょうか?また、それを使った動的ライブラリ検索アルゴリズムはどうなっていますか?
-
[解決済み] GUIDは100%一意ですか?
-
[解決済み] セッションとは何ですか?どのように機能するのですか?
-
[解決済み】ビットシフト(bit-shift)演算子とは、どのようなもので、どのように機能するのですか?
-
[解決済み】引数かパラメータか?重複
-
[解決済み] TypeとClassの違いは何ですか?
-
[解決済み] さまざまなアプローチやコンセプトを理解するために学ぶべき重要な言語とは?[クローズド]
-
[解決済み] 2つの角度の差を求めるにはどうすればよいのでしょうか?
-
[解決済み] スタックオーバーフローを引き起こす最短のコードは何ですか?[クローズド]
-
[解決済み] 単項のブーリアン・トグル演算子を持つ言語はありますか?