0

重複の可能性:
浮動小数点の不正確な例

C/C++ の WHILE ループ内に次の行があります。

while(...)
{
    x = x + float(0.1); // x is a float type. Is the cast necessary?
}

x は 0 から始まります。最初のループの後、x = 0.1 になります。カッコいい。2 回目のループの後、x = 0.2 です。それは良いですね。しかし、3 回目のループの後、x = 0.3000001 です。それはよくありません。0.3000001 ではなく、値として 0.3 が必要です。それはできますか?私は間違ってループしていますか?

4

5 に答える 5

3

浮動小数点はそのようには機能しません。任意の 2 つの実数の間に無限に多くの実数が存在し、有限量のビットのみが存在するため、ほとんどの場合、浮動小数点表現は概算になります。詳細については、このリンクを参照してください。

于 2013-01-16T14:59:28.310 に答える
1

次のようなコード:

for (int i = 0;… ; ++i)
{
    float x = i / 10.f;
    …
}

x各反復の の値floatが i/10 に最も近い値になります。通常、i/10 の正確な値は では表現できないため、通常は正確ではありませんfloat

の場合double、定義を次のように変更します。

    double x = i / 10.;

これにより、より細かい が得られるxため、通常はさらに i/10 に近くなります。ただし、通常は正確に i/10 にはなりません。

正確に i/10 が必要な場合は、要件をさらに説明する必要があります。

于 2013-01-16T15:07:18.057 に答える
1

これは、浮動小数点数に関する一般的な誤解です。0.332 ビットまたは 64 ビットの 2 進浮動小数点では正確に表現できない場合があります。多くの数値は正確に表現できません。不要な構文を無視して、ループは正常に機能しています。

while (...)
{
    x += 0.1f; /* this will do just fine in C++ and C */
}

これが意味をなさない場合は、無限の数の浮動小数点数が存在するという事実を考慮してください...それらを記述するビット数は有限です。

いずれにせよ、正確な結果が必要な場合は、適切な精度の 10 進数型を使用する必要があります。ただし、お金に関する計算を行っていない限り、正確な結果は必要ない可能性があります(必要だと思っていても)。

于 2013-01-16T15:01:00.003 に答える
1

これはループではなく、フロートがメモリ内でどのように表現されるかです。限られたバイト数ですべての実数を直接表現できるとは思いませんよね?

Aを a0.3で正確に表すことはできませんfloat。a を試してくださいdouble(うまくいくとは言っていませんが、おそらくうまくいかないでしょうが、オフセットは低くなります)。

于 2013-01-16T14:59:03.047 に答える
0

この場合、キャストは必要ありません

float x;
x = x + float(0.1);

あなたは単に書くことができます

x+= 0.1
于 2013-01-16T14:58:53.017 に答える