DBL_EPSILON / std :: neuro_limits :: epsilonは、1を追加したときに違いを生む最小値を提供します。
この知識を何か役に立つものに適用する方法を理解するのに苦労しています。
イプシロンは、コンピューターが処理できる最小値よりもはるかに大きいため、イプシロンよりも小さい値を使用しても安全であるという正しい仮定のように思われますか?
使用している値の比率を1/イプシロンより小さくする必要がありますか?
DBL_EPSILON / std :: neuro_limits :: epsilonは、1を追加したときに違いを生む最小値を提供します。
この知識を何か役に立つものに適用する方法を理解するのに苦労しています。
イプシロンは、コンピューターが処理できる最小値よりもはるかに大きいため、イプシロンよりも小さい値を使用しても安全であるという正しい仮定のように思われますか?
使用している値の比率を1/イプシロンより小さくする必要がありますか?
DBL_EPSILON の定義はそうではありません。これは、1 と 1 の後の次の表現可能な数値の差です (定義では、丸めモードが「0 に向かって」または「負の無限大に向かって」に設定されていることを前提としていますが、常にそうであるとは限りません)。
数値解析について十分に知っていると役立つものです。しかし、この場所はそれについて学ぶのに最適な場所ではないのではないかと心配しています. 例として、このように 2 つの浮動小数点数がほぼ等しいかどうかを判断する比較関数を作成する際に使用できます。
bool approximatively_equal(double x, double y, int ulp)
{
return fabs(x-y) <= ulp*DBL_EPSILON*max(fabs(x), fabs(y));
}
(しかし、ulp を決定する方法を知らなければ、道に迷うでしょう。また、中間結果が非正規化である場合、この関数にはおそらく問題があります。fp の計算は、堅牢にするために複雑です)
X
と の次の値の差はX
によって異なりX
ます。と の次の値の
DBL_EPSILON
差のみです。1
1
イプシロンの違いでstd::nextafter
2つをテストするために使用できます:double
bool nearly_equal(double a, double b)
{
return std::nextafter(a, std::numeric_limits<double>::lowest()) <= b
&& std::nextafter(a, std::numeric_limits<double>::max()) >= b;
}
因子 * イプシロンの差で2 つをテストする場合はdouble
、次を使用できます。
bool nearly_equal(double a, double b, int factor /* a factor of epsilon */)
{
double min_a = a - (a - std::nextafter(a, std::numeric_limits<double>::lowest())) * factor;
double max_a = a + (std::nextafter(a, std::numeric_limits<double>::max()) - a) * factor;
return min_a <= b && max_a >= b;
}