1

重複の可能性:
10 進数を 2 進数で正確に表現できないのはなぜですか?

私は、C++ で数学を使用するための非常に単純なアルゴリズムを開発しています。

また、「step」という名前の浮動小数点変数があります。while ループを終了するたびに、step を 10 で割る必要があります。

だから私のコードはこのようなものです、

float step = 1;
while ( ... ){
      //the codes
      step /= 10;
}

私のばかげた単純な論理では、それで終わりです。step は、1 から 0.1、0.1 から 0.01 の 10 で除算されます。

しかし、そうではなく、代わりに 0.100000000001 のようなものが表示されます。そして、私は「What The Hell」のようでした

誰かがこれで私を助けてくれませんか。私が完全に理解していないのは、おそらくデータ型自体に関するものです。したがって、誰かがさらに説明できれば幸いです。

4

2 に答える 2

5

数値の問題です。問題は、1/10 が 2 進数の無限の長い数であり、10 による除算を連続して適用すると、各ステップでエラーが合計されることです。より安定したバージョンを取得するには、除数を掛ける必要があります。ただし、注意してください。結果も正確ではありません。エラーを最小限に抑えるために、float を double に置き換えることができます。

unsigned int div = 1;
while(...)
{
    double step = 1.0 / (double)div;
    ....
    div *= 10;
}
于 2011-12-24T06:26:04.547 に答える
2

2 進浮動小数点演算では 10 による除算を正確に行うことはできないため、予想とは少し異なる結果が表示されます。

バイナリ フローティングは、分母が 2 のべき乗である整数比として表されます。10 分の 1 に正確に等しい 2 進数の分数は存在しないため、予想した数値ではなく、最も近い表現可能な数値が表示されます。

于 2011-12-24T06:20:19.737 に答える