Matlab代码中的奇怪之处

时间:2013-03-24 22:44:30

标签: matlab

我尝试编译以下代码。

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

我应该得到的x的最后一个值等于1.02(这在while循环中会产生错误的条件)

但是,我非常想知道我总是将x的最后一个值等于1并且while循环停止。我不知道我的代码有什么问题。 有人可以帮我找一下吗?

2 个答案:

答案 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,但它实际上更大,所以它出现为假而且存在循环。