質問は本当に単純です。ビット単位で等しくない可能性があるが、すべての可能な意味で差が比較的小さい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つの質問に興味があります。
- 実生活で何が起こるでしょうか?
- 標準はそれについて何と言っていますか?
UPD
説明に置き換えた間違った例がありました。(
エラーを指摘してくれた@MarcGlisseと@KevinBallardに感謝します。)
UPD 2 この問題をかなりうまくカバーするトピックは次のとおりです。floor()とceil()の表現可能な結果