6

次のコードが実行されると、MATLAB は間違いを犯します。誰かがこれを確認できますか?

floor([0.1:0.1:2]/0.01)

では、129 はここで何をしているのですか??

ans = 10 20 30 40 50 60 70 80 90 100 110 120 129 140 150 160 170 180 190 200
4

3 に答える 3

9

これは、コロンで生成されたベクトルによる浮動小数点丸めエラーです。
ラスマンが言ったように、もしそうなら:

floor((0.1:0.1:2 + eps) / 0.01)

丸め誤差はありません。

ただし、コロン演算子の仕組みに基づいて、次のように同じ計算を行うことをお勧めします。

floor([(1:20)/10] / 0.01)

[編集Rasmanのコメントに続いて、後者のアプローチは負の値でも機能することを追加しますが、追加epsは時々失敗します]

要するに、丸め誤差を最小限に抑えるには、整数でコロン演算子を使用する方が良いということです。

于 2012-06-07T11:41:49.190 に答える
4

おそらく浮動小数点計算を行っているため、不正確な値が 129.99999999999999... 130 ではなく、129 になります。

于 2012-06-07T11:27:42.177 に答える
4

これは、配列の構築によってもたらされる丸め近似です。解決策は、eps を追加することです。

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01))
于 2012-06-07T11:33:18.757 に答える