当我在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时,这不成立?
myeps
gmol16391#
4/3在数学中是4/3。4/3不能被精确地编码为浮点数。大多数浮点数是dyadic rationals(整数乘以2的某个幂),并使用一个 * 附近的 * 值。* 1就像我们不能用十进制写4/3 * 精确 *,只有1.3333333,并在很多位数后停止。在这种情况下,减法应该和乘法以及最后的减法一样精确,但是第一个商不是4/3,所以最后的结果可能不是0.0。
4/3
十进制数十六进制0x1.55555555555555
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作为答案。
3*(sym(4)/sym(3)-1)-1
sym(4)/sym(3)
sym(4/3)
2条答案
按热度按时间gmol16391#
4/3
在数学中是4/3。4/3不能被精确地编码为浮点数。大多数浮点数是dyadic rationals(整数乘以2的某个幂),并使用一个 * 附近的 * 值。* 1就像我们不能用十进制写4/3 * 精确 *,只有1.3333333,并在很多位数后停止。在这种情况下,减法应该和乘法以及最后的减法一样精确,但是第一个商不是4/3,所以最后的结果可能不是0.0。
十进制数
十六进制0x1.55555555555555
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作为答案。