2

次のコードをコンパイルしてみました。

x = 0
while x <= 1
    x = x+0.02
end

取得する必要があるxの最後の値は1.02に等しい(whileループで誤った条件を作成します)

ただし、xの最後の値が常に1になり、whileループが停止しているのは非常に不思議です。コードの何が問題なのかわかりません。誰かが私が見つけるのを手伝ってくれませんか?

4

2 に答える 2

5

0.02は、浮動小数点の2進数()で正確に表すことができないdoubleため、丸め誤差が発生します。その結果、1つには到達しませんが、1よりもわずかに大きい数になります。

disp(x-1)コードの後に​​追加してみて、x正確に1ではないことを確認してください。

このサイトは、0.02がIEEE754倍精度浮動小数点でどのように表されるかを示しています:http://www.binaryconvert.com/result_double.html ? decimal = 048046048050

ここで重要なのは、0.02より少し大きいことです。

これを解決する1つの方法は、整数ループ変数を使用することです。まだdouble型ですが、整数値しかないため、非常に大きな数(> = 2 ^ 56?)を使用しない限り、丸めの問題は発生しません。

for n=0:100
    x = n/100;
end
于 2013-03-24T22:53:25.950 に答える
0

format long実行する前に試してみてください:これを取得します:

x =  0.920000000000000
x =  0.940000000000001 
x =  0.960000000000001 
x =  0.980000000000001
x =  1.000000000000000

最後の1に注意してください。0.02は、浮動小数点演算で正確に表すことはできません。したがって、比較すると見た目1は大きくなりますが、実際には大きいため、falseとして表示され、ループが存在します。

于 2013-03-24T22:55:27.783 に答える