我尝试编译以下代码。
x = 0
while x <= 1
x = x+0.02
end
我应该得到的x的最后一个值等于1.02(这在while循环中会产生错误的条件)
但是,我非常想知道我总是将x的最后一个值等于1并且while循环停止。我不知道我的代码有什么问题。 有人可以帮我找一下吗?
答案 0 :(得分:5)
0.02无法用浮点二进制数(double
)精确表示,因此您将得到一些舍入误差。结果是你没有达到一个,而是一个比一个数字略大的数字。
尝试在代码后添加disp(x-1)
,以查看x
不完全是1。
此站点显示了如何在IEEE754双精度浮点中表示0.02:http://www.binaryconvert.com/result_double.html?decimal=048046048050
这里必不可少的是它略大于0.02
解决此问题的一种方法是使用整数循环变量。它仍然是double类型,但它只有整数值,除非你使用非常大的数字(&gt; = 2 ^ 56?),否则它没有舍入问题。
for n=0:100
x = n/100;
end
答案 1 :(得分:0)
在跑步前尝试format long
,你会得到这个:
x = 0.920000000000000
x = 0.940000000000001
x = 0.960000000000001
x = 0.980000000000001
x = 1.000000000000000
注意最后的1。 0.02不能用浮点运算精确表示。因此,虽然它在比较它时看起来像1
,但它实际上更大,所以它出现为假而且存在循环。