浮点数精度为何随初始化方式变化?Matlab数组实例疑问
为什么两个冒号序列中
x==0.2的结果不同? 这本质是IEEE754浮点数运算的误差累积差异导致的,具体拆解:
对于
x=0:0.1:1,第三个元素的计算逻辑是0 + 2*0.1。由于0.1的二进制是无限循环小数,其IEEE754双精度表示是一个近似值,但2倍的这个近似值恰好等于直接写0.2时的浮点存储值——因为0.2本身就是0.1的2倍,二者的浮点近似完全对齐,所以x(3)==0.2返回true。对于
x=-1:0.1:1,对应0.2的元素是第13个,计算逻辑是-1 + 12*0.1。这里的问题出在12*0.1的浮点运算:12可拆为10+2,10*0.1的浮点结果并不是精确的1.0(因为0.1的近似值乘以10后会多出一个极小的尾差),再加上2*0.1(即0.2的近似值),最终得到的结果会比直接的0.2浮点值多出微小偏移量。这个偏移量肉眼不可见,但足以让==精确比较返回false。
简单来说,前者是2次运算得到0.2,误差未累积到改变结果的程度;后者是12次运算的误差累积,导致最终值和目标值的浮点表示不再一致。
注:Matlab中冒号序列的每个元素实际通过
start + i*step(i为索引偏移)计算,而非逐次累加,但不管哪种方式,12*0.1的浮点运算误差都存在——因为0.1本身无法精确表示,多次乘法/累加的误差会逐步放大。
内容的提问来源于stack exchange,提问作者magnesium
相关产品推荐
相关产品推荐

