0

さまざまなケースの出力を説明してください

#include<stdio.h>
int main()
{
    float a=5.9; //a=0.9
    if (a==5.9)
        printf("Equal");
    else if (a<5.9)
        printf("Less than");
    else
        printf("Greater than");
    return 0;
} 

a が 5.9 の場合、出力は「より大きい」、a が 0.9 の場合、出力は「より小さい」です。なんで?

4

6 に答える 6

3

C では、リテラル "5.9" には型doubleがあり、一般的なコンパイラによって 5.9000000000000003552713678800500929355621337890625 に変換されます。これは、バイナリ IEEE-754 浮動小数点を使用し、その数値がdouble5.9 に最も近い a として表現可能な値であるためです。コードfloatはその値で a を初期化します。doubleこれには aを aに変換する必要がfloatあり、結果は 5.900000095367431640625 になります。これが値floatに最も近い値だからdoubleです。明らかに、後者は前者よりも大きいため、出力は「より大きい」です。

.9 を使用すると、リテラルの「.9」はdouble0.90000000000000002220446049250313080847263336181640625 に変換されます。次に、それは 0.89999997615814208984375 にdouble変換されます。これは明らかに.floatdouble

于 2013-03-05T01:19:51.047 に答える
1

変数は float ですが、定数は double です。その値は正確に格納できないため、ti は float と double として異なる方法で格納されます。同じデータ型を使用すると、望ましい結果が得られます

http://codepad.org/1q5mwFGd

http://codepad.org/Q4lOQnG8

于 2013-03-05T01:08:31.280 に答える
0

浮動小数点数を比較するときは、「==」を避けるのが最善です。

これは、一部の値が精度を失うことなく正しく格納できないためです。

したがって、次のように言う方が適切です。

if( fabs(a-5.9) < .0001 ) {
    // 'EQUAL' or at least near enough!
}

これは計算に時間がかかることはわかっていますが、期待どおりに動作します。

于 2013-03-05T01:10:32.917 に答える
0

浮動小数点数は本質的に不正確です。簡単な紹介については、ここで少し読むことができます。 http://floating-point-gui.de/errors/comparison/

効果的な比較戦略に関する提案については、この投稿を参照してください。 float と double の比較で最も効果的な方法は何ですか?

于 2013-03-05T01:06:35.863 に答える
0

これは、内部的に浮動小数点数がバイナリ形式で格納されており、5.9 を 5.9 と正確に表現できないためです。次の同様の質問と回答をご覧ください。なぜ C 浮動小数点型は出力で 125.1 の実際の入力を 125.099998 に変更するのですか?

于 2013-03-05T01:09:21.770 に答える
0

10 進数の 2 進数変換により、0.9 は 2^-1 のべき乗の合計として表されます。

0.9 - (0.5 + 0.25 + 0.125) = 0.025

しかし、0.025 は 2^-1 の正確な累乗ではありません。したがって、比較では両方の数値を同じ精度で表す必要があります。float と double は精度が異なるため、比較すると等しくありません。

于 2013-03-05T01:16:33.243 に答える