浮動小数点の等値比較では、奇妙なエッジ ケースが発生することがあります。たとえば、2 つの NaN 値が同一のビット パターンであっても等しくないと比較されるなどです。
しかし、不平等は常に平等の逆であると仮定できますか? つまり、標準の IEEE 64 ビット浮動小数点数が x64 などの主流のアーキテクチャに実装されていると仮定すると、どのビット パターンが存在するかに関係なく、 と のいずれかが常に真になるのでしょうかa == b
?a != b
浮動小数点の等値比較では、奇妙なエッジ ケースが発生することがあります。たとえば、2 つの NaN 値が同一のビット パターンであっても等しくないと比較されるなどです。
しかし、不平等は常に平等の逆であると仮定できますか? つまり、標準の IEEE 64 ビット浮動小数点数が x64 などの主流のアーキテクチャに実装されていると仮定すると、どのビット パターンが存在するかに関係なく、 と のいずれかが常に真になるのでしょうかa == b
?a != b
はい、これは常に真です。演算子 == が != に対して正反対の値を返さないビット パターンの数値解釈はありません。
異なるビット パターン (負のゼロ 0x80... はゼロ 0x00 と等しい...) と等しいと比較されるビット パターン、または既に述べたように同じビット パターンが等しくない (NaN) と比較される例外がありますが、!= は常に== の反転。
どの関係がテストされているかについて注意する必要があります。「x と y の値が異なるか?」には、さまざまなテストがあります。と「x は y と等しくありませんか?」</p>
x または y が NaN、またはその両方である場合、それらが異なる値を持っているというのは false ですが (少なくとも 1 つはまったく値を持っていないため)、等しいということはありません。
C 演算子!=
は「等しくない」について尋ねるので、後者の質問に答えます。そして「等しくない」を問うので、「等しい」の論理否定です。
一部の言語では、前者の質問をする方法が提供されています。