型キャストなしでafloat
と aを直接比較するコードは壊れていると思います。double
が暗黙的に変換されると言語仕様に記載されている場合でもfloat
、比較を適切に実行する方法が 2 つあります。どちらも、「サイレント」なデフォルトの動作 (つまり、警告を生成せずにコンパイルする動作) を正当化するほど支配的ではありません。 . 両方のオペランドを として評価して変換を実行したい場合はdouble
、意図を明確にするために明示的な型キャストを追加することをお勧めします。double
特定の->float
変換が精度を失うことなく元に戻せるかどうかを確認するテスト以外のほとんどの場合、float
値間の比較がおそらくより適切であると思われます。
基本的に、浮動小数点値X
を比較するときY
、または何らかの種類の値を比較する場合、比較はX
orY
が大きいこと、または数値が「区別できない」ことを示していると見なす必要があります。X
より大きいことを示す比較Y
は、表すはずの数値がおそらく より小さいX
か、またはそれに近いことを示すために使用する必要がありX
ます。数字が区別できないという比較は、まさにそれを意味します。物事をそのように見ると、 へのキャストによって実行される比較は、 で実行される比較float
ほど「有益」ではないかもしれませんが、単純に間違っdouble
ている結果が得られる可能性は低くなります。比較して、次の点を考慮してください。
double x, y;
float f = x;
f
と を比較する場合y
、関心があるのはを floaty
に丸めた値と比較する方法でx
ある可能性がありますが、実際に知りたいのは、 の丸められた値を知っていて、x
何か言えるかどうかである可能性が高くなります。x
との関係についてy
。x
が 0.1 でy
0.2 の場合、が より大きいf
かどうかを判断するのに十分な情報があります。0.100000001 の場合、そうではありません。後者の場合、両方のオペランドが double にキャストされると、比較は誤ってそれを暗示します。x
y
y
x
大きかった; それらが両方とも float にキャストされている場合、比較はそれらを区別できないと報告します。double
値が 100 万分の 1 以内の場合だけでなく、両方のオペランドを にキャストした場合の比較結果が間違っている可能性があることに注意してください。x=1e40 と y=1e300 のように、数百桁ずれている可能性があります。比較f
しy
て比較float
すると、それらは区別できなくなります。として比較するdouble
と、小さい方の値が誤って大きい方と比較されます。