MATLAB 中的浮点错误 - 线性间隔向量
Floating point error in MATLAB - linearly spaced vectors
OS: Win 7 64 位。 Matlab: 2014a, 2015a
当我创建一个向量时如下:
a = 0.2:0.2:1
我得到:
a = 0.2000 0.4000 0.6000 0.8000 1.0000
这是意料之中的。现在,当我想查看向量中是否存在 0.6 时,我输入:
a == 0.6
我得到:0 0 0 0 0
find(a == 0.6)
还有 return 一个 Empty matrix: 1-by-0
这些都是出乎意料的。它能够找到所有其他值,但对于 0.6 存在问题。我认为虽然创建了 0.6,但它实际上是 0.600000000000000001 或类似的东西,这是一个问题。通过a > 0.6
可以看到是这样,会得到0 0 1 1 1
.
1-首先为什么会这样?
2 秒我们能在 Matlab 中看到一个数字的完整值吗?如果是的话,它的功能或设置是什么?
我使用 linspace
创建了相同的矢量,但这也没有帮助。我通过键入以下内容找到了解决方案:a = roundn(a, -10)
。但是,我认为一开始甚至不需要这样的解决方案。
3-是否有更好的方法让 Matlab 产生精确值?
谢谢大家的帮助。
首先,阅读有关浮点值的 MATLAB 文档,特别注意有关浮点误差和精度的部分:
MATLAB Floating Point
您遇到了一个非常普遍的浮点精度问题。重要的是要认识到你实际上并不是在比较:
>> a = 0.6;
>> b = 0.6;
>> a == b
ans = 1
相反,您实际上是在比较:
>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a == b
ans = 0
这里明显的逻辑谬误的原因是算术实际上并不相等。值 0.6
和 0.2
均以双精度浮点数表示为最接近的可能值,差异称为 "floating point error"。
观察错误很简单:
>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a - b
ans = -1.110223024625157e-16
最简单的解决方案是对标量和向量使用相同精度的 round()
,然后执行比较:
>> a = 0.6;
>> b = [ 0.2 : 0.2 : 1 ];
>> roundn ( a , -10) == roundn ( b , -10 )
ans = 0 0 1 0 0
OS: Win 7 64 位。 Matlab: 2014a, 2015a
当我创建一个向量时如下:
a = 0.2:0.2:1
我得到:
a = 0.2000 0.4000 0.6000 0.8000 1.0000
这是意料之中的。现在,当我想查看向量中是否存在 0.6 时,我输入:
a == 0.6
我得到:0 0 0 0 0
find(a == 0.6)
还有 return 一个 Empty matrix: 1-by-0
这些都是出乎意料的。它能够找到所有其他值,但对于 0.6 存在问题。我认为虽然创建了 0.6,但它实际上是 0.600000000000000001 或类似的东西,这是一个问题。通过a > 0.6
可以看到是这样,会得到0 0 1 1 1
.
1-首先为什么会这样?
2 秒我们能在 Matlab 中看到一个数字的完整值吗?如果是的话,它的功能或设置是什么?
我使用 linspace
创建了相同的矢量,但这也没有帮助。我通过键入以下内容找到了解决方案:a = roundn(a, -10)
。但是,我认为一开始甚至不需要这样的解决方案。
3-是否有更好的方法让 Matlab 产生精确值?
谢谢大家的帮助。
首先,阅读有关浮点值的 MATLAB 文档,特别注意有关浮点误差和精度的部分: MATLAB Floating Point
您遇到了一个非常普遍的浮点精度问题。重要的是要认识到你实际上并不是在比较:
>> a = 0.6;
>> b = 0.6;
>> a == b
ans = 1
相反,您实际上是在比较:
>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a == b
ans = 0
这里明显的逻辑谬误的原因是算术实际上并不相等。值 0.6
和 0.2
均以双精度浮点数表示为最接近的可能值,差异称为 "floating point error"。
观察错误很简单:
>> a = 0.6;
>> b = 0.2 + 0.2 + 0.2;
>> a - b
ans = -1.110223024625157e-16
最简单的解决方案是对标量和向量使用相同精度的 round()
,然后执行比较:
>> a = 0.6;
>> b = [ 0.2 : 0.2 : 1 ];
>> roundn ( a , -10) == roundn ( b , -10 )
ans = 0 0 1 0 0