5
#include<stdio.h>
int main()
{
    float a,b;
    a=4.375;
    b=4.385;

    if(a==4.375)
        printf("YES\n");
    else
        printf("NO\n");

    if(b==4.385)
        printf("YES\n");
    else
        printf("NO\n");

    return 0;
}

このコードの答え:

YES 
NO

float と double の値を比較するといつも思っていました。それは決して一致しません。値が純粋な整数でない限り。しかし、ここではフロート "a" には 4.375 が含まれていますが、"b" は正確ではありません。

printf("%0.20f\n",a);
printf("%0.20f\n",b);

This prints :

4.37500000000000000000
4.38500022888183593750



but if i print

printf("%0.20f\n",4.475);

It prints 4.47499990463256835938

この丸め効果は、あるものではどのように示され、他のものではどのように示されていますか。

誰でもこれを説明できますか。float変数の値がそれに含まれる値と一致する場合と一致しない場合、「WE」はどのように判断する必要がありますか?

4

2 に答える 2

1

10 進数から 2 進数への変換は、10 進数が0.50.25、... などの 2 進数で合計できる場合にのみ正確です。

たとえば、あなたの場合

0.375 = 0.25 + 0.125 = 2 -2 + 2 -3

したがって、2進分数を使用して正確に表すことができます。

2進分数を正確に使用して数値0.385を表すことはできません。したがって0.5、 、0.250.125、... などの数値、またはこれらの数値の組み合わせは、浮動小数点数として正確に表すことができます。0.385 などの他の値では、比較または等値演算を実行すると、誤った結果が得られます。

于 2013-06-18T10:15:45.163 に答える
1

浮動小数点は魔法ではありません。それらには正確な値が含まれており、それと比較すると等しくなります。2 つの問題は次のとおりです。浮動小数点数に 1 を加算してから 1 を減算すると、その加算によって最下位ビットの精度が失われる可能性があり、減算しても期待どおりの値に戻りません。2) 浮動小数点バイナリ形式ですべての 10 進数値を正確に表すことはできません。たとえば、使用する桁数に関係なく、1/3.0 の値を 10 進値として正確に書き込めないのとまったく同じ方法で、0.1 の正確な値を浮動小数点 2 進数に格納することはできません。

しかし、あなたの場合、値を保存して同じ値と比較すると、両方とも同じ問題が同じ方法で発生するため、等しいと比較する必要があります。 ただし、あなたの問題は、同じように比較していないことです。4.375 と 4.385 は float ではなく、double であり、格納するために変換されるため、後で比較すると、変換された値がまったく同じではない可能性があります。float 値を使用するように 4.385f と 4.385f を記述すると、両方とも YES になるはずです。

于 2013-06-18T10:16:40.310 に答える