いつもお世話になります。
double型の変数について、0.0であるか否かをチェックする時(例:ゼロ割チェック)
今まで以下のように書いていました。
cpp
1#include <cfloat> 2#include <cmath> 3double x = 0.0; 4bool is_zero = (fabs(x) < DBL_EPSILON);
しかしながら、DBL_MIN
というものも存在し、かつ定義がそれぞれ以下のようになっていることを知りました。
DBL_MAX
:1と1以上の最小の数との差を表すDBL_MIN
:正の最小の数を表す- 一般に
DBL_MIN < DBL_EPSILON
である
質問1
double
型変数がゼロか否かを確認する際(とりあえずゼロ割回避のシーン限定で結構です)、
DBL_MIN
とDBL_EPSILON
、どちらを使うべきかの推奨はあるのでしょうか。
cpp
1bool is_zero = (fabs(x) < DBL_EPSILON); // This or... 2bool is_zero = (fabs(x) < DBL_MIN); // THIS ?
質問2
DBL_EPSILON
が「1と1以上の〜」となっていて、「0と0以上の〜」ではない理由が知りたいです。
推測は、以下のようにDBL_EPSILON
に掛け算をして、スケールに応じて使えるようにかな、と思いましたが、
正しいでしょうか。
(意味の定義を0と0以上の~にしてしまうと掛け算する意味がない?)
cpp
1#include <cfloat> 2#include <cmath> 3 4double x = 50.000000000000015; 5double y = 50.00000000000002; 6 7bool is_same = (fabs(x - y) < (DBL_EPSILON * std::max(x, y)));
大変浅学で恐縮です。
よろしくお願い致します。
参考リンク
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/23 09:49