Matlab中关于浮点运算的几个问题

pnwntuvh  于 2022-11-24  发布在  Matlab
关注(0)|答案(2)|浏览(244)

当我在Matlab中计算以下内容时

myeps = abs(3*(4/3-1)-1);
format long e
eps_myeps = [eps ; myeps]

输出如下:

eps_myeps =

     2.220446049250313e-16
     2.220446049250313e-16

为什么myeps不为0?为什么当基数为3而不是2时,这不成立?

gmol1639

gmol16391#

4/3在数学中是4/3。4/3不能被精确地编码为浮点数。大多数浮点数是dyadic rationals(整数乘以2的某个幂),并使用一个 * 附近的 * 值。* 1就像我们不能用十进制写4/3 * 精确 *,只有1.3333333,并在很多位数后停止。
在这种情况下,减法应该和乘法以及最后的减法一样精确,但是第一个商不是4/3,所以最后的结果可能不是0.0。

  • 一个

十进制数
十六进制0x1.55555555555555

kmbjn2e3

kmbjn2e32#

我觉得OP也在寻找"为什么myeps不是0"的答案,"怎么可能得到一个0作为答案"。所以这里是答案。你需要MATLAB的Symbolic Math Toolbox
您可以使用sym来建立符号数字。符号数字是精确的表示法,与浮点数不同。
因此,如果你在MATLAB中输入3*(sym(4)/sym(3)-1)-1(一旦你有了工具箱),答案将是精确的
0
注意sym(4)/sym(3)部分。如果你尝试sym(4/3),MATLAB会先得到一个浮点数,然后尝试将其转换为符号。这将失去精度,不会产生0作为答案。

相关问题