Matlab浮点运算疑问:myeps为何非零?基数为3时等式为何不成立?
问题分析:为什么
3*(4/3-1)-1的计算结果不为0? 首先看Matlab中执行的代码:
myeps = abs(3*(4/3-1)-1); format long e eps_myeps = [eps ; myeps]
得到的输出:
eps_myeps = 2.220446049250313e-16 2.220446049250313e-16
1. 为什么myeps不为0?
这是二进制浮点数的精度限制导致的:
- 计算机里的浮点数(比如Matlab用的双精度浮点数)是以二进制(基数2)存储的。
- 分数
4/3在二进制下是无限循环的小数(类似十进制里的1/3),无法被精确表示,存储时只能取近似值。 - 所以
4/3-1得到的不是精确的1/3,乘以3之后也无法得到精确的1,最后减1就会得到一个极小的误差值——这个值正好等于双精度浮点数的机器精度eps。
2. 为什么基数为3时等式成立,基数为2时不成立?
- 当基数是3时,
4/3可以表示为有限的三进制小数:1.1_3(也就是1 + 1/3),能被精确存储。 - 此时计算
4/3-1会得到精确的1/3,乘以3得到精确的1,减1结果就是0。 - 但我们的计算机用的是二进制(基数2)浮点数系统,
4/3无法精确表示,自然就会产生误差,等式也就不成立了。
内容的提问来源于stack exchange,提问作者Questioner5453
相关产品推荐
相关产品推荐

