1

重複の可能性:
Matlabが間違った答えを出す

0:.1:1-range 関数を使用すると、次のことが起こる理由を誰かに説明できますか?

>> vecA = 0:.1:1;
>> vecB = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];
>> vecA == vecB

ans =

     1     1     1     0     1     1     1     1     1     1     1

vecA(4) が 0.3 に等しくないのはなぜですか? 彼らはまったく同じに見えます;)

vecA =

  Columns 1 through 7

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000

  Columns 8 through 11

    0.7000    0.8000    0.9000    1.0000

>> vecB

vecB =

  Columns 1 through 7

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000

  Columns 8 through 11

    0.7000    0.8000    0.9000    1.0000

ここの精度に問題があると思いますか?それとも私の理解に問題がありますか?

4

2 に答える 2

3

コンピュータは 2 進数であり、ネイティブの浮動小数点形式では小数を正確に格納できません。(比率タイプまたは固定小数点 10 進タイプを使用できますが、これらを使用した計算ははるかに遅くなります。)

結果として、浮動小数点値が等しいかどうかをテストしても、実際には役に立ちません。代わりに差の絶対値を確認してください。

What Every Computer Scientist Should Know About Floating Point Arithmeticを必ずお読みください。

( http://floating-point-gui.de/などの簡単な説明もありますが、Goldberg の論文を置き換えるのではなく、理解しやすくするためにこれらを使用する必要があります)


この場合に実際に表示されるのは、0.2 + 0.1 != 0.3(範囲は最初のバージョンを使用するvecA(3) = vecA(2) + step)ということです。

于 2012-06-11T13:33:39.687 に答える
2

これは、有限精度の浮動小数点演算の一般的な結果である可能性があります。使ってみて

    format long

次に値を出力して、より正確な表示を確認します。内部的に vecA は、ループと値の増分または範囲の分割を使用して作成され、小さな違いを引き起こしていると思います。浮動小数点値を同等にしているため、この問題が発生しています。一般に、float の直接比較の一般的な結果です。

于 2012-06-11T13:33:00.313 に答える