在上一个问题中,有等式:
e = 1 – 3*((4/3) – 1)
而不是0
,而是:
e =2.2204e-16
我理解为什么会发生这种情况,因为4/3
无法准确表示。
4/3
的最近代表是:
1.3333333333333332593184650249895639717578887939453125
在必要的操作之后,获得e =2.2204e-16
。
现在,我无法理解涉及e
的这些方程中的奇怪行为:
1)
b = 1e-16 + 1 - 1e-16;
c = 1e-16 - 1e-16 + 1;
我们希望b
等于c
,但事实并非如此。我知道操作顺序和错误有些可疑,但我不完全理解为什么b
不等于c
。
2)
sqrt(1e-16 + 1) - 1;
ans=0
现在,我怀疑当减法完成时,由于操作数几乎相等,所以有某种取消。但我仍然有点困惑,并希望得到详细的解释。谢谢。
答案 0 :(得分:0)
即使在MATLAB中使用浮点数时,在比较这些值时也不准确。如果需要特定的精度水平,那么应该使用容差(相对误差,绝对误差等)等近似相等的断言。
检查Comparing Floating Point Numbers, 2012 Edition以及here。在MATLAB中,可以通过eps
函数实现相对误差精度。