以下是我的matlab代码段:
clear all;
x0=0.5;
x2=1.4;
h=0.1;
while(x0<x2)
x0=x0+0.1;
end
x0
毫无疑问x0
的结果是1.4
,让我困惑的是,当我将x2=1.4
替换为x2=0.8, 0.9, 1.0, 1.1, or 1.2
(其中任何一个人)时,结果会变得不正确。
例如,x2=0.9
会使代码生成x0=1.0
而不是x0=0.9
。我发现在x0
增加到0.9
的过程中,x0<x2
(0.9<0.9
)会1
(真),这肯定是错误的。
这里发生了什么?
答案 0 :(得分:3)
基本上你不应该直接比较浮点数。 {3}由Sam Roberts提供,以便更好地理解这一点。
在二进制文件中,0.1成为计算机最终必须截断的重复小数。因此,每次添加0.1时,您并没有真正添加0.1和舍入误差化合物,最终导致您的比较丢失。所以你实际上并没有评估0.9 <0.9,而是截断的转换为二进制的总和为0.1 9倍,截断的二进制版本为0.9。数字不一样。
答案 1 :(得分:3)
我想稍微延长Dan的答案。运行以下代码:
clear all;
x0=0.5;
x2=0.9;
h=0.1;
while(x0<x2)
x0=x0+0.1;
disp(x2-x0); % <-- I added this line
end
x0
输出(ideone):
0.30000
0.20000
0.10000
1.1102e-16
-0.100000
x0 = 1.00000
输出的第4行显示舍入错误:将0.1
添加到0.5
四次后,结果将小于0.9
:差异为1.1102e-16
。这就是x0
最终成为1.0
的原因。
答案 2 :(得分:0)
如果你真的需要比较浮点值,我建议你做一点不同的事情。你可以做类似于下面所写的事情;其中threshold
是一个可接受的边际,即这个数量不同的数字,它们被认为是不同的,如果差异小于这个数量,它们被认为是相同的。
function result = floatCompare(a,b,operation,threshold)
if nargin < 4
threshold = eps;
end
if nargin < 3
operation = 'eq';
end
switch operation
case 'eq'
disp('equals')
result = abs(a-b) < threshold;
case 'lt'
disp('less than')
result = b-a > threshold;
case 'gt'
disp('greater than')
result = a-b > threshold;
end
end