a / (b - c)
問題を簡潔にするために、s の式を計算したいとしましょうfloat
。
結果が意味のあるものであることを確認するために、b
とc
が等しいかどうかを確認できます。
float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
return a / (b - c);
}
しかし、私のテストでは、意味のある結果を保証することも、可能であれば結果を提供することに失敗しないことも保証できないことが示されています。
ケース 1:
a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
結果: if 条件は満たされませんが、式は正しい結果 100000008 を生成します (float の精度に関して)。
ケース 2:
a = 1e33f;
b = 0.000003;
c = 0.000002;
結果: if 条件は満たされていますが、式は意味のある結果を生成しません+1.#INF00
。
引数ではなく、結果を確認する方がはるかに信頼性が高いことがわかりました。
const float INF = numeric_limits<float>::infinity();
float x = a / (b - c);
if (-INF < x && x < INF)
{
return x;
}
しかし、イプシロンは何のためにあり、イプシロンが使いやすいと誰もが言っているのはなぜですか?