Matlab-“;0:1:1“;意外的精确行为

Matlab-“;0:1:1“;意外的精确行为,matlab,floating-point,precision,floating-accuracy,floating-point-precision,Matlab,Floating Point,Precision,Floating Accuracy,Floating Point Precision,可能重复: 当我使用0:.1:1-range函数时,有人能解释一下为什么会发生以下情况吗 >> vecA = 0:.1:1; >> vecB = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]; >> vecA == vecB ans = 1 1 1 0 1 1 1 1 1 1 1 为什么vecA(4)不等于0.3?他们看起来一

可能重复:

当我使用
0:.1:1
-range函数时,有人能解释一下为什么会发生以下情况吗

>> vecA = 0:.1:1;
>> vecB = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];
>> vecA == vecB

ans =

     1     1     1     0     1     1     1     1     1     1     1
为什么vecA(4)不等于0.3?他们看起来一模一样;)


我认为这里的精度有问题?或者我的理解有问题吗?

这可能是有限精度浮点运算的一般结果。试用

    format long

然后输出值以查看更精确的显示。我可以想象,在内部,vecA是使用一个循环和一个范围的值递增或除法创建的,这会造成微小的差异。当您将浮点值相等时,就会遇到这个问题。这通常是直接比较浮动的常见结果

这可能是有限精度浮点运算的一般结果。试用

    format long

然后输出值以查看更精确的显示。我可以想象,在内部,vecA是使用一个循环和一个范围的值递增或除法创建的,这会造成微小的差异。当您将浮点值相等时,就会遇到这个问题。这通常是直接比较浮动的常见结果

计算机是二进制的,它们的原生浮点格式不能准确地存储小数。(可以使用比率类型或定点小数类型,但使用这些类型的计算速度要慢得多。)

因此,测试浮点值是否相等实际上是无用的。改为检查差值的绝对值

你一定要读书

(还有一些更简单的解释,例如,但你应该用这些来帮助你理解戈德堡的论文,而不是取代它)



在本例中,您实际看到的是
0.2+0.1!=0.3
(范围使用第一个版本,
vecA(3)=vecA(2)+step

计算机是二进制的,其本机浮点格式不能准确存储小数。(可以使用比率类型或定点小数类型,但使用这些类型的计算速度要慢得多。)

因此,测试浮点值是否相等实际上是无用的。改为检查差值的绝对值

你一定要读书

(还有一些更简单的解释,例如,但你应该用这些来帮助你理解戈德堡的论文,而不是取代它)




在本例中,您实际看到的是
0.2+0.1!=0.3
(范围使用第一个版本,
vecA(3)=vecA(2)+step

我使用7.11.1.866(R2010b)服务包1有趣的东西:
vecA(4)-0.3=1.0e-016*0.5551
这里有一个比较实际值的简洁方法:
sprintf('.20f\n',vecA(4),0.3)
。再看看eps(0.3)检查另一个答案:我使用7.11.1.866(R2010b)Service Pack 1有趣的东西:
vecA(4)-0.3=1.0e-016*0.5551
这里有一个比较实际值的简洁方法:
sprintf('.20f\n',vecA(4),0.3)
。再看看eps(0.3)检查另一个答案:如果使用了一个循环,我希望总结一下错误?或者某种程度上是对称的?我明白你的意思,但是当你的值和你无法访问的其他人代码计算的值进行比较时,很难用浮点运算来假设任何东西。我在代码中使用了
abs(vecA-vecB)
,但我没有预料到这种行为。但我认为这是一个很好的例子,每个人都应该知道他/她在做什么……我同意你的看法如果使用了循环,我希望总结一下错误?或者某种程度上是对称的?我明白你的意思,但是当你的值和你无法访问的其他人代码计算的值进行比较时,很难用浮点运算来假设任何东西。我在代码中使用了
abs(vecA-vecB)
,但我没有预料到这种行为。但我认为这是一个很好的例子,每个人都应该知道他/她在做什么……我同意你的观点我知道浮点运算的基本原理,但我会尝试一下这篇论文。非常感谢。无论如何,我希望matlab的简单范围函数在这里更加健壮…
计算机是二进制的,它们不能准确地存储小数。
是一个不真实的陈述。@rubenvb:澄清为引用本机格式。当然,您可以将有理数(包括小数)表示为用户定义的类型,但是数学效率很低。@BenVoigt现在您有了我的+1
:)
。由于背景文件的缘故,我会选择这一个-它非常有用。我知道浮点基础知识,但会尝试一下这篇论文。非常感谢。无论如何,我希望matlab的简单范围函数在这里更加健壮…
计算机是二进制的,它们不能准确地存储小数。
是一个不真实的陈述。@rubenvb:澄清为引用本机格式。当然,您可以将有理数(包括小数)表示为用户定义的类型,但是数学效率很低。@BenVoigt现在您有了我的+1
:)
。由于背景文件的缘故,我将选择这一个,它非常有帮助。