浮動小数点数とゼロを比較する
質問
C++ FAQ lite "[29.17] 浮動小数点の比較がうまくいかないのですが? は、この等値性テストを推奨しています。
#include <cmath> /* for std::abs(double) */
inline bool isEqual(double x, double y)
{
const double epsilon = /* some small number such as 1e-5 */;
return std::abs(x - y) <= epsilon * std::abs(x);
// see Knuth section 4.2.2 pages 217-218
}
-
これは、ゼロに等しい唯一の数は次のとおりであることを意味する、ということでよいでしょうか。
+0
であり-0
? -
この関数はゼロをテストするときにも使うべきで、むしろ次のようなテストが必要です。
|x| < epsilon
?
更新
Daniel Daranas が指摘したように、この関数はおそらく
isNearlyEqual
と呼ぶべきでしょう (これは私が気にしているケースです)。
誰かが指摘した "Comparing Floating Point Numbers" を指摘されたので、もっと目立つように紹介したいと思います。
どのように解決するのですか?
あなたの観察は正しいです。
もし
x == 0.0
であれば
abs(x) * epsilon
がゼロであるかどうかをテストしているのです。
abs(y) <= 0.0
.
もし
y == 0.0
であれば、テストしているのは
abs(x) <= abs(x) * epsilon
のどちらかをテストしていることになります。
epsilon >= 1
(これは違う) または
x == 0.0
.
ということで、どちらかというと
is_equal(val, 0.0)
または
is_equal(0.0, val)
は無意味であり、単に
val == 0.0
. もし
まさに
+0.0
そして
-0.0
.
この場合、FAQの推奨は限定的な有用性しかありません。
浮動小数点の比較には、1 つのサイズですべてに対応するものはありません。
変数のセマンティクス、許容される値の範囲、そして計算によってもたらされる誤差の大きさについて考えなければなりません。 FAQ でも注意事項があり、この関数は通常 x と y の大きさがイプシロンよりかなり大きい場合は問題ないと言っていますが、あなたの判断は異なるかもしれません" 。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 文字列が数値(float)であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] 除算を強制的に浮動小数点にするにはどうしたらいいですか?除算は0に切り捨てられ続けますか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
-
[解決済み】常に小数点以下2桁を表示する数値の書式設定
-
[解決済み】浮動小数点値の比較はどのくらい危険か?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] 浮動小数点値が0と等しいかどうかをチェックするのは安全ですか?
-
浮動小数点数にはなぜ符号付きゼロがあるのですか?