2

我试图编译以下代码。

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

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

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

4

2 回答 2

5

0.02 不能用浮点二进制数 ( double) 精确表示,因此会出现一些舍入错误。结果是你没有达到一个,而是一个比一个略大的数字。

尝试disp(x-1)在您的代码之后附加,看看那x不完全是 1。

该站点显示了 IEEE754 双精度浮点数如何表示 0.02:http: //www.binaryconvert.com/result_double.html? decimal=048046048050

这里最重要的是它比 0.02 大一点

解决此问题的一种方法是使用整数循环变量。它仍然是 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,但实际上它更大,因此它出现为假并存在循环。

于 2013-03-24T22:55:27.783 回答