-1

質問は本当に単純です。ビット単位で等しくない可能性があるが、すべての可能な意味で差が比較的小さい2つのフロートを考えてみます。また、フロア間の差が比較的小さいイプシロンよりも小さいと仮定しましょう(0.01で十分です)。それらのフロアはビット単位で等しくなりますか(つまり、operator ==に関して等しい)?

たとえば、以下のコードはtrue常に返されますか?

bool areRoundedFloatsEqual(float lhs, float rhs) {
    if (lhs > 0 && rhs > 0 && fabs(lhs - rhs) < 0.01) {
        lhs = std::floor(lhs);
        rhs = std::floor(rhs);

        if (fabs(lhs - rhs) < 0.5)
            return lhs == rhs;
    }

    return true;
}

実際、私は2つの質問に興味があります。

  1. 実生活で何が起こるでしょうか?
  2. 標準はそれについて何と言っていますか?

UPD 説明に置き換えた間違った例がありました。(
エラーを指摘してくれた@MarcGlisseと@KevinBallardに感謝します。)

UPD 2 この問題をかなりうまくカバーするトピックは次のとおりです。floor()とceil()の表現可能な結果

4

2 に答える 2

2

fabs(floor(a) - floor(b)) < 0.0001の場合のみfloor(a) == floor(b)、doubleが正確に表すことができる整数の範囲内にある限り、次のようになります。std :: floorの後にintにキャストすると、正しい結果が保証されますか?

于 2013-02-13T21:09:22.710 に答える
0

floor(x)とceil(x)は常に整数値です。

2つの数値floorまたはceil(x)とfloorまたはceil(y)の違い​​は、2つの整数値の違いであり、したがって整数です。

このような差の絶対値は、両方の値が同じである場合に限り、1未満です。

于 2014-06-21T12:23:04.063 に答える