-1

重複の可能性:
float と float リテラルの
比較で奇妙な出力 float 変数と double 変数の比較

C で double と float を使用したテストを行っていますが、その理由を説明できません。

    float x = 3.4F;
    if(x==3.4)
        printf("true\n");
    else printf("false\n");
    double y = 3.4;
    if (y==3.4)
        printf("true\n");
    else printf("false\n");

結果は False と True になります。私のために説明してください。

4

5 に答える 5

5

3.4 は double として正確に表現することはできません。これは、3 分の 1 を有限桁数を使用する 10 進数として正確に表現できないのと同じ理由で、表現は繰り返されます。

したがって、double リテラル3.4は、実際には 3.4 に最も近い double 値です。3.4Fは 3.4 に最も近い float 値ですが、最も近い double 値とは異なります。

float と double を比較すると、float は double に変換されますが、値は変わりません。

したがって3.4F != 3.40.3333 != 0.33333333

于 2012-06-26T07:54:36.113 に答える
5

x == 3.4それ以外の場合x == 3.4F、3.4 は倍精度 (デフォルト) です。リンゴとオレンジではなく、常に同類のものと比較してください。

編集:異なる精度の型間の比較の結果が真か偽かは、コンパイラの浮動小数点表現に依存します。

浮動小数点数は、単精度 (float) か倍精度かに関係なく、近似値です。

于 2012-06-26T07:42:41.850 に答える
2

結果が false と true になるという保証はありませんが、基本的な考え方は非常に単純です3.4。に割り当てると、float丸められます。比較すると、その丸められた数値は double に昇格されますが、必ずしも と同じdoubleではありません3.4

2 番目のケースでは、すべてが 2 倍になっています。

于 2012-06-26T07:43:37.953 に答える
0

等しいかどうかの比較 浮動小数点演算は正確ではありません。0.2 のような単純な値は、2 進浮動小数点数を使用して正確に表現することはできません。また、浮動小数点数の精度が限られているため、演算の順序を少し変更すると結果が変わる可能性があります。コンパイラや CPU アーキテクチャが異なると、一時的な結果が異なる精度で格納されるため、環境の詳細によって結果が異なります。計算を行って、その結果を何らかの期待値と比較すると、意図したとおりの結果が得られる可能性はほとんどありません。

つまり、計算を行ってから次の比較を行う場合: if (result == expectedResult)

その場合、比較が真になる可能性は低いです。比較が真の場合、おそらく不安定です。入力値、コンパイラ、または CPU のわずかな変更によって結果が変化し、比較が偽になる可能性があります。

于 2012-06-26T07:43:54.750 に答える
0

ヒントとして、浮動小数点数 (float または double) を '==' と比較することは、ほとんどの場合、ステートメントが true にならない可能性があるため、不適切なプログラミング方法です。2 つの数値は、最下位ビットが異なる場合があります。

次のようなものを使用することをお勧めします。

abs(x - y) < EQUALITY_MARGIN

EQUALITY_MARGIN 十分に小さい数であること。

于 2012-06-26T09:13:34.323 に答える