在Matlab中为何(eps * 0.5) + 1不大于1?
关于Matlab中(eps*0.5)+1等于1的原因
这是双精度浮点数的二进制存储机制导致的,核心是浮点数的有效精度有限,无法精确表示所有实数,当小数值的精度超出当前数的有效范围时,相加操作会触发舍入,最终结果不变。
- 明确eps的定义:Matlab里的
eps(默认指eps(1))是1与大于1的最小可表示双精度浮点数之间的差值,也就是你测得的2.220446049250313e-16。它的本质是当前数值(这里是1)对应的“最小可分辨增量”。 - 双精度浮点数的存储逻辑:双精度浮点数用64位存储,其中52位是尾数位(加上隐含的1位,总共53位有效二进制精度)。1的二进制表示是
1.000...0(后面跟着52个0),当你尝试给它加一个数时,只有这个数的大小足够让尾数位产生变化,结果才会改变。eps*0.5的二进制表示需要的精度超过了1的有效尾数位能承载的范围,所以加到1上时会被直接舍入,最终结果还是1。 - 直观类比:假设我们用一个简化的3位尾数位浮点数系统,1的表示是
1.00,下一个可表示的数是1.01,两者差值是0.01(对应这个系统的eps)。如果给1.00加0.001(也就是eps/2),这个值无法在3位尾数位中体现,相加后结果还是1.00。 - 补充说明:浮点数的精度是随数值大小变化的,比如
eps(2)的值是2*eps(1),数值越大,相邻可表示浮点数的差值就越大,能分辨的最小增量也就越大。
内容的提问来源于stack exchange,提问作者m615
相关产品推荐
相关产品推荐

