Julia 我在朱莉娅的矩阵乘法中犯了什么错误?

Julia 我在朱莉娅的矩阵乘法中犯了什么错误?,julia,Julia,在朱莉娅: In [1]: M1 = [1 3 4; 45 64 33; 456 3 454;] Out [1]: 3x3 Array{Int64,2}: 1 3 4 45 64 33 456 3 454 In [2]: M1 * inv(M1) Out [2]: 3x3 Array{Float64,2}: 1.0 6.93889e-18 -8.67362e-19 0

在朱莉娅:

In  [1]: M1 = [1 3 4;
              45 64 33;
              456 3 454;]

Out [1]: 3x3 Array{Int64,2}:
   1   3    4
  45  64   33
 456   3  454

In  [2]: M1 * inv(M1)

Out [2]: 3x3 Array{Float64,2}:
  1.0           6.93889e-18  -8.67362e-19
  0.0           1.0          -2.08167e-17
 -1.42109e-14  -8.88178e-16   1.0        
M1*inv(M1)应该根据定义得到单位矩阵。怎么了

我在Matlab中尝试了同样的方法:

>> M1 = [1 3 4;
         45 64 33;
        456 3 454;]
M1 =
     1     3     4
    45    64    33
   456     3   454
>> inv(M1)
ans =
  -0.280088987764182   0.013057987135465   0.001518595540939
   0.052057842046719   0.013251438796731  -0.001421869710306
   0.280978865406007  -0.013203075881414   0.000686753397495
>> M1 * inv(M1)
ans =
   1.000000000000000   0.000000000000000  -0.000000000000000
                   0   1.000000000000000  -0.000000000000000
  -0.000000000000014  -0.000000000000001   1.000000000000000
>> 
Matlab在这里返回正确的结果。我想朱莉娅在这里不会犯错误的。那么我的计算/符号有什么问题

编辑


这个问题是由浮点结果中的位数引起的。我应该问,如何在Julia中设置结果数字精度?

Julia和Matlab实际上给出了相同的结果 (例如,在这两种情况下,左下角元素均为-1.4e-14): 它不完全是单位矩阵,因为浮点运算不精确

可以在显示结果之前显式地对其进行四舍五入

M1 = [
  1    3   4;
  45  64  33;
  456  3 454
]
round( M1 * inv(M1), 6 )
# 3x3 Array{Float64,2}:
#  1.0   0.0  -0.0
#  0.0   1.0  -0.0
#  0.0  -0.0   1.0
如果你想要一个精确的结果,你也可以使用理性

M1 = [
  1//1  3   4;
  45   64  33;
  456   3 454
]
M1 * inv(M1)
# 3x3 Array{Rational{Int64},2}:
#  1//1  0//1  0//1
#  0//1  1//1  0//1
#  0//1  0//1  1//1

相关问题:浮点运算的常用参考文献是(D.Goldberg,1991),但我发现(N.Toronto和J.McCarthy,2014)更容易阅读。几乎精确的浮点数学看起来非常简洁,作者John McCarthy在计算机科学领域很有名。绝对是一本好书!非常感谢。哦,是杰伊·麦卡锡,不是约翰·麦卡锡。医生仍然很好。