在Matlab中解释1 - 3*(4/3 - 1)= 2.2204e-16

hhh*_*hhh 0 floating-point matlab floating-accuracy double-precision ieee-754

我试图理解Matlab中的双精度数.为什么这个1 - 3*(4/3 - 1)不等于零?

Ste*_*non 6

实数4/3不能用双精度(或任何其他二进制浮点格式)表示,因为它不是二元有理数.因此,当您4/3在MATLAB中进行计算时,您获得的值将四舍五入为最接近的可表示的双精度数,这正是:

1.3333333333333332593184650249895639717578887939453125
Run Code Online (Sandbox Code Playgroud)

从这个值中减去1是精确的(这是一个众所周知的FP误差分析定理,它将两个相互之间的数字减去精确),因此得到的结果4/3 - 1是:

0.3333333333333332593184650249895639717578887939453125
Run Code Online (Sandbox Code Playgroud)

碰巧这个数字乘以3的结果也可以准确表示:

0.9999999999999997779553950749686919152736663818359375
Run Code Online (Sandbox Code Playgroud)

最后,从1.0中减去也是精确的(根据前面提到的定理):

0.0000000000000002220446049250313080847263336181640625
Run Code Online (Sandbox Code Playgroud)

因此,在计算中只有一个舍入误差源,因为4/3不能表示为double,而计算的最终结果只是初始错误结转.