1

この投稿によると、float と double を比較する場合、float は double として扱われるべきです。次のプログラムは、このステートメントに従っていないようです。動作は非常に予測不可能に見えます。これが私のプログラムです:

void main(void)
{
    double a = 1.1;  // 1.5
    float b = 1.1;   // 1.5
    printf("%X  %X\n", a, b);
    if ( a == b)
        cout << "success " <<endl;
    else
        cout << "fail" <<endl;
}
  • 以下のプログラムを実行すると、「失敗」と表示されます。
  • しかし、a と b を 1.5 に変更すると、「成功」と表示されます。

値の16進表記も印刷しました。どちらの場合も異なります。私のコンパイラは Visual Studio 2005 です

この出力を説明できますか? ありがとう。

4

4 に答える 4

10
float f = 1.1;
double d = 1.1;
if (f == d)

この比較では、 の値がftype に昇格されdoubleます。あなたが見ている問題は比較ではなく、初期化にあります。1.1は浮動小数点値として正確に表現できないため、 および に格納されている値fd、表現できる最も近い値です。ただしfloat、 とdoubleはサイズが異なるため、有効ビット数が異なります。の値fが に昇格するとdouble、値が格納されたときに失われた余分なビットを取り戻す方法がないため、余分なビットはすべてゼロになります。これらのゼロ ビットは のビットと一致しないdため、比較は false です。比較が成功する理由1.5は、1.5 floatそしてとしてdouble; 下位ビットに多数のゼロがあるため、プロモーションがゼロを追加すると、結果はdouble表現と同じになります。

于 2013-06-27T13:35:26.543 に答える
1

型キャストなしでafloatと aを直接比較するコードは壊れていると思います。doubleが暗黙的に変換されると言語仕様に記載されている場合でもfloat、比較を適切に実行する方法が 2 つあります。どちらも、「サイレント」なデフォルトの動作 (つまり、警告を生成せずにコンパイルする動作) を正当化するほど支配的ではありません。 . 両方のオペランドを として評価して変換を実行したい場合はdouble、意図を明確にするために明示的な型キャストを追加することをお勧めします。double特定の->float変換が精度を失うことなく元に戻せるかどうかを確認するテスト以外のほとんどの場合、float値間の比較がおそらくより適切であると思われます。

基本的に、浮動小数点値Xを比較するときY、または何らかの種類の値を比較する場合、比較はXorYが大きいこと、または数値が「区別できない」ことを示していると見なす必要があります。Xより大きいことを示す比較Yは、表すはずの数値がおそらく より小さいXか、またはそれに近いことを示すために使用する必要がありXます。数字が区別できないという比較は、まさにそれを意味します。物事をそのように見ると、 へのキャストによって実行される比較は、 で実行される比較floatほど「有益」ではないかもしれませんが、単純に間違っdoubleている結果が得られる可能性は低くなります。比較して、次の点を考慮してください。

double x, y;
float f = x;

fと を比較する場合y、関心があるのはを floatyに丸めた値と比較する方法でxある可能性がありますが、実際に知りたいのは、 の丸められた値を知っていて、x何か言えるかどうかである可能性が高くなります。xとの関係についてyxが 0.1 でy0.2 の場合、が より大きいfかどうかを判断するのに十分な情報があります。0.100000001 の場合、そうではありません。後者の場合、両方のオペランドが double にキャストされると、比較は誤ってそれを暗示します。xyyx大きかった; それらが両方とも float にキャストされている場合、比較はそれらを区別できないと報告します。double値が 100 万分の 1 以内の場合だけでなく、両方のオペランドを にキャストした場合の比較結果が間違っている可能性があることに注意してください。x=1e40 と y=1e300 のように、数百桁ずれている可能性があります。比較fyて比較floatすると、それらは区別できなくなります。として比較するdoubleと、小さい方の値が誤って大きい方と比較されます。

于 2013-06-28T21:28:02.287 に答える