次のコードをコンパイルしてみました。
x = 0
while x <= 1
x = x+0.02
end
取得する必要があるxの最後の値は1.02に等しい(whileループで誤った条件を作成します)
ただし、xの最後の値が常に1になり、whileループが停止しているのは非常に不思議です。コードの何が問題なのかわかりません。誰かが私が見つけるのを手伝ってくれませんか?
次のコードをコンパイルしてみました。
x = 0
while x <= 1
x = x+0.02
end
取得する必要があるxの最後の値は1.02に等しい(whileループで誤った条件を作成します)
ただし、xの最後の値が常に1になり、whileループが停止しているのは非常に不思議です。コードの何が問題なのかわかりません。誰かが私が見つけるのを手伝ってくれませんか?
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
format long
実行する前に試してみてください:これを取得します:
x = 0.920000000000000
x = 0.940000000000001
x = 0.960000000000001
x = 0.980000000000001
x = 1.000000000000000
最後の1に注意してください。0.02は、浮動小数点演算で正確に表すことはできません。したがって、比較すると見た目1
は大きくなりますが、実際には大きいため、falseとして表示され、ループが存在します。